青蛙学Linux—Ansible基础
Ansible是一套基于Python的自动化运维工具,可以实现批量系统设置、批量程序部署、批量执行命令等功能。Ansible目前属于红帽公司。
Ansible有以下特性:
- 丰富的内置模块,调用特定的模块完成特定的任务
- 支持自定义模块,可以使用任何语言实现
- 基于Python实现,维护更加简单
- 部署简单
- 安全,基于OpenSSH
- 支持使用playbook编排任务,批量执行,playbook使用YAML格式
- 幂等性,一个任务执行1次和执行多次的效果是一样的,不因重复执行带来意外情况
- 支持非root用户管理操作,支持sudo
Ansible可以一次操作多台主机,也支持对主机进行分组,一次操作一组主机,所以对于管理数量巨大的主机及需要进行许多重复任务的运维来说是一个非常得力的助手。
使用Ansible的注意事项:
- 执行Ansible的主机一般成为主控端、中控、master或堡垒机
- 主控端Python版本必须在2.6及以上
- 被控端Python版本如果小于2.4需要安装python-simplejson
- 被控端如果开启SELinux需要安装libselinux-python
- Windows不能成为主控端
1、Ansible基本架构
Ansible的基本架构如下图所示:
- Ansible:核心
- Core Modules:核心模块,是Ansible自带的模块,用于执行特定的任务
- Custom Modules:扩展模块,如果核心模块不足以完成某种任务,可以通过扩展模块执行
- Plugins:插件,完成较小型的任务,用于辅助模块完成某个功能
- Playbooks:剧本,通过编写Playbooks可以一次性完成多项任务
- Connectior Plugins:连接插件,Ansible基于此插件连接到各个被管理主机,支持local、SSH、paramiko三种连接方式,默认使用SSH
- Host Inventory:主机清单,Ansible根据主机清单管理各个主机。小型环境可以直接在/etc/absible/hosts中指定管理的主机,大型环境可以使用静态或动态的主机清单来进行管理
2、Ansible任务执行模式和流程
Ansible可以通过两种模式执行自动化任务,分别为:
- ad-hoc:单个模块单条命令执行
- playbook:将要执行的多个任务写到一个playbook中批量执行
Ansible执行任务的流程如下图所示:
3、Ansible的安装以及命令套件介绍
Ansible现在为红帽公司所有,已经是RHEL的一个组成部分,所以推荐使用YUM安装Ansible。Ansible位于EPEL源中,所以使用YUM安装Ansible时必须先安装EPEL源。
使用YUM安装EPEL源:
yum install epel-release
使用YUM安装Ansible:
yum install ansible
Ansible一共提供了以下7个命令:
- ansible:Ansible的核心指令,主要用于执行ad-hoc命令。需要指定主机、选项和模块,默认不指定模块时使用command模块
- ansible-doc:用于查看模块信息,常用选项有-l和-s,-l用于查看已经安装的模块;-s用于查看模块的用法,参数为模块名
- ansible-galaxy:用于方便的从https://galaxy.ansible.com下载第三方扩展模块
- ansible-lint:用于检查指定playbook的语法
- ansible-playbook:用于读取指定的playbook并执行它
- ansible-pull:Ansible默认使用push模式,该命令用于使Ansible使用pull模式,这和使用push模式的工作原理正好相反,一般用于有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间;要在一个没有网络连接的机器上运行Ansible,比如在启动之后的安装中
- ansible-vault:用于加密playbook。当你的playbook中涉及到密码之类的敏感信息时,可以使用该命令加密playbook,这样通过cat看到的将是一个密码串类的文件,编辑时需要输入设定的密码才能打开。加密后的playbook在执行时需要加上-ask-vault-pass参数,输入密码后才能正常执行
4、Ansible配置文件
Ansible的配置文件为:
/etc/ansible/ansible.cfg
该配置文件内容全部被注释,表示Ansible使用的是默认配置,如果需要修改只要取消某项配置的注释状态即可。
以下为一些基础的配置字段:
- inventory:指定主机清单,默认为/etc/ansible/hosts
- library:Ansible模块的存放位置
- module_utils:模块工具存放位置
- remote_tmp:Ansible在对指定主机执行一个动作时,会把生成的py文件推送到指定主机并执行。这个字段定义了这个py文件的保存位置,py文件在执行完成后会自动删除
- local_tmp:本机临时命令执行路径
- forks:设置Ansible的线程数,通过提高线程数可以加快任务的执行进度
- poll_interval:轮询间隔
- sudo_user:sudo使用的用户
- ask_sudo_pass:使用sudo时是否需要输入密码
- ask_pass:是否需要用户输入连接密码
- remote_port:指定连接对端节点时使用的端口
- module_lang:Ansible模块和系统之间进行通信使用的语言,默认为C语言
- host_key_checking:跳过SSH首次连接提示验证部分,False表示跳过
- timeout:连接超时时间
- module_name:Ansible执行任务时默认使用的模块
- nocolor:Ansible会为执行任务的返回信息加上颜色以更好的区分状态信息和失败信息,设置为1取消该功能
- private_key_file:在使用SSH公钥私钥认证时的密钥路径
5、Ansible主机清单设置
主机清单定义了Ansible管理的主机,默认的主机清单为:
/etc/ansible/hosts
该文件为我们提供了一些简单的示例来介绍如何配置主机清单:
# This is the default ansible 'hosts' file. # # It should live in /etc/ansible/hosts # # - Comments begin with the '#' character # - Blank lines are ignored # - Groups of hosts are delimited by [header] elements # - You can enter hostnames or ip addresses # - A hostname/ip can be a member of multiple groups # Ex 1: Ungrouped hosts, specify before any group headers. ## green.example.com ## blue.example.com ## 192.168.100.1 ## 192.168.100.10 # Ex 2: A collection of hosts belonging to the 'webservers' group ## [webservers] ## alpha.example.org ## beta.example.org ## 192.168.1.100 ## 192.168.1.110 # If you have multiple hosts following a pattern you can specify # them like this: ## www[001:006].example.com # Ex 3: A collection of database servers in the 'dbservers' group ## [dbservers] ## ## db01.intranet.mydomain.net ## db02.intranet.mydomain.net ## 10.25.1.56 ## 10.25.1.57 # Here's another example of host ranges, this time there are no # leading 0s: ## db-[99:101]-node.example.com
通过示例,我们可以看到,主机清单支持单一主机、主机分组([]中的内容即为组名)和主机范围(www[001:006].example.com);可以使用IP地址、域名或主机名定义主机。
注意:一个主机可以属于多个主机组。
注意:当有单一主机和主机组同时存在时,未分组的主机必须位于文件的顶部。
注意:主机组还可以嵌套主机组,使用以下方法实现
[web] 192.168.0.2 192.168.0.3 [db] 192.168.0.5 192.168.0.6 [server:children] web db # 使用:children表示主机组下面嵌套的是子主机组
另外,在定义主机时还可以使用主机变量,用于定义连接到主机的端口、密码等信息。常用的主机变量有:
- ansible_ssh_host:指定被管理主机的真实IP地址
- ansible_ssh_port:指定连接被管理主机时使用的SSH端口
- ansible_ssh_user:指定连接被管理主机时使用的用户
- ansible_ssh_pass:指定连接被管理主机时使用的密码
- ansible_sudo_pass:指定在被管理主机上使用sudo时的密码
- ansible_sudo_exec:如果被管理主机上的sudo不在默认位置,使用此变量指定sudo位置
- ansible_ssh_private_key_file:使用SSH公钥私钥系统时私钥文件的保存路径
- ansible_shell_type:定义被管理主机上使用的shell类型
- ansible_connection:连接被管理主机的方式,有local、SSH和paramiko
- ansible_python_interpreter:指定被管理主机的Python解释器路径,默认为/usr/bin/python
- ansible_*_interpreter:指定被管理主机其他语言解释器的路径,这里的*为ruby或perl等其他语言
除了使用Ansible提供的变量外,我们还可以自定义变量。自定义变量可以在Ansible命令中引用,引用方法为{{自定义变量}}。
主机变量的使用
可以这样使用主机变量:
[web] 192.168.0.2 ansible_ssh_port=3333 192.168.0.3 ansible_ssh_port=3333
也可以这样使用:
[web] 192.168.0.2 192.168.0.3 [web:vars] ansible_ssh_port=3333