ansible
ansible
概述
Ansible是一款开源运维自动化工具,通过Ansible可以实现运维自动化、提高运维工程师的工作效率、减少人为失误,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,ansible本身没有批量部署的能力,ansible只提供一个框架,通过ansbile所运行的模块实现批量部署的功能。
■知识点:
◆基于Python开发,默认基于ssh协议控制所有节点,支持多并发。
◆基于模块化工作,内置了丰富的模块。
◆受控端不需要安装客户端,不启动任何服务,但是需要安装python3-simplejson。
◆受控端如果要开启SElinux,需要安装python3-libselinux。
■官网参考指导:http://www.ansible.com.cn/index.html
安装部署的前提条件
■系统可以访问外网或者已配置本地yum源。
■已安装统信服务器操作系统。
■本示例不开启SElinux。
安装主控端
执行如下命令,安装ansible包。
yum install ansible -y
安装受控端
执行如下命令,安装python3-simplejson包。
yum install python3-simplejson -y
Ansible配置
在主控端,执行如下命令,生成SSH免密密钥对。
[root@localhost ~]# ssh-keygen -t rsa
执行如下命令,拷贝公钥到受控端。
[root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub root@受控端IP地址
Ansible的使用
Inventory使用方法

:::note Inventory是Ansible管理主机信息的配置文件,默认存放在“/etc/ansible/hosts”中。在该文件中,可以定义主机,也可以定义主机组,实现对主机进行管理。同时,还可以定义hosts文件,对其进行管理,详情请参见“Inventory使用”。 :::
■配置规则如下:
◆以[]包含部分代表组名,设备列表支持主机名和IP地址。
◆默认使用22端口作为管理设备端口。如果使用了非默认端口,则需要在主机名称或者IP地址之后使用冒号加端口进行标明。
◆hosts文件支持通配符操作。
■配置举例:
[web]
192.168.1.2
192.168.1.3
[test]
www.zabbix_test.com:8090
[database]
oracle1.com
oracle[2:5].com ##[2:5]表示2~5之间的所有数字,即表示oracle1.com、oracle2.com…的所有主机
Inventory使用示例
■执行如下命令,只对web组中的192.168.1.2主机操作,通过--limit参数限定主机的变更。
ansible web -m command -a "systemctl status sshd" --limit "192.168.1.2"
■执行如下命令,只对192.168.1.3主机操作,通过IP地址限定主机的变更。
ansible 192.168.1.3 -m command -a "systemctl status sshd"
■执行如下命令,只对192.168.1.0网段主机操作。
ansible 192.168.1.* -m command -a "systemctl status sshd"
■执行如下命令,对所有默认hosts文件内的所有主机进行操作。
ansible all -f 5 -m ping

:::note ping在这里表示ping模块,并不是指操作系统自带的ping命令。 :::
■执行如下命令,列出所有web组内的所有主机。
ansible web --list
Modules的使用
正如概述中所提到的,Ansible采用模块进行工作。在管理受控端时,Ansible封装了多个模块进行命令下发、执行来管理受控端。常用模块如下所示:
command模块
command模块在远程主机执行命令,不支持管道、重定向等shell的特性。
| 参数 | 描述 |
|---|---|
| chdir | 在执行命令之前,先切换到该目录。 |
| creates | 一个文件名,当这个文件存在,则该命令不执行。 |
| executable | 切换shell来执行命令,需要使用命令的绝对路径。 |
| free_form= | 要执行的Linux指令,一般使用Ansible的-a参数代替。 |
| removes | 一个文件名,当这个文件不存在,则该命令不执行。 |

:::note 在执行的命令中,有管道或者变量时,就需要使用shell模块。例如:[root@localhost ~]# ansible all -m command -a "mkdir /opt/uos"。 :::
shell模块
shell模块在远程主机执行命令,相当于调用远程主机的Shell进程,然后在该Shell下打开一个子Shell运行命令。和command模块的区别是,它支持Shell特性,如管道、重定向等。例如:
[root@localhost ~]# ansible web -m shell -a "echo uos"
[root@localhost ~]# ansible web -m shell -a "echo uoser > ./uostest.txt"
copy模块
copy模块用于复制指定主机文件到远程主机的指定位置。
| 参数 | 描述 |
|---|---|
| backup | 在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes和no。 |
| content | 用于替代“src”,可以直接设定指定文件的值。 |
| dest | 必选项。将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录。 |
| directory_mode | 递归设定目录的权限,默认为系统默认权限。 |
| force | 如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖;如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes。 |
| group | 应该拥有文件/目录的组的名称,将被馈送到'chown'。 |
| mode | 应该是模式的文件或目录,如0644将被馈送到'chmod'。 |
| owner | 应该拥有文件/目录的用户的名称,将被馈送到'chown'。 |
| recurse | 复制源目录中的所有内容。 |
| others | 所有的file模块里的选项都可以在这里使用。 |
| src | 被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容;如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。 |
例如:
[root@localhost ~]# ansible all -m copy -a 'src=/root/test.txt dest=/opt/uos'
[root@master opt]# ansible 192.168.1.2 -m copy -a "src=/root/test.txt dest=/opt/uos/ mode=0440 force=yes"
hostname模块
hostname模块用于管理远程主机上的主机名。
表6.3hostname模块参数说明
| 参数 | 描述 |
|---|---|
| name | 指定主机名。 |
例如:
[root@localhost ~]# ansible 192.168.1.2 -m hostname -a "name=uos"
yum模块
yum模块基于yum机制,对远程主机管理程序包。
表6.4yum模块参数说明
| 参数 | 描述 |
|---|---|
| name | 程序包名称,可以带上版本号。若不指明版本,则默认为最新版本。 |
| state=present|atest|absent | 指明对程序包执行的操作。present表明安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包。 |
| disablerepo | 在用yum安装时,临时禁用某个仓库的ID。 |
| enablerepo | 在用yum安装时,临时启用某个仓库的ID。 |
| conf_file | yum运行时的配置文件,而不是使用默认的配置文件。 |
| disable_gpg_check=yes|no | 是否启用完整性校验功能。 |
例如:
[root@localhost ~]# ansible web -m shell -a "/usr/bin/rm -rf /root/test.txt"
[root@localhost ~]# ansible web -m yum -a "name=httpd state=present"
service模块
service模块用来管理远程主机上的服务。
表6.5service模块参数说明
| 参数 | 描述 |
|---|---|
| name | 被管理的服务名称。 |
| state=started|stopped|restarted | 动作包含启动、关闭或重启。 |
| enable=yes|no | 表示是否设置该服务开机自启动。 |
| runlevel | 如果设定了enabled开机自启动,则要定义在哪些运行目标下自动启动。 |
例如:
[root@localhost ~]# ansible web -m service -a "name=httpd enabled=yes state=started"
user模块
user模块主要用于管理远程主机上的用户帐号。
表6.6user模块参数说明
| 参数 | 描述 |
|---|---|
| append | 如果是yes,就是给这个用户添加一个组。 |
| comment | 可选择地设置用户帐户的描述(也称为“GECOS”)。 |
| createhome | 除非设置为no,否则当创建帐户或主目录不存在时,将为用户创建主目录。 |
| force | 当与“state = absent”一起使用时,行为与“userdel --force”一样。 |
| generate_ssh_key | 为yes时,生成秘钥对。生成密钥时,只会生成公钥文件和私钥文件。和直接使用ssh-keygen指令效果相同,不会生成authorized_keys文件。 |
| group | 设置用户主组,后面跟用户组名称。 |
| groups | 设置多个组,当设置为'groups='的时候,用户将从主组以外的所有组移除。 |
| home | 可以选择设置用户的主目录。 |
| move_home | 如果与“home =”一起使用时设置为“yes”,则尝试将用户的主目录移动到指定的目录(如果尚未存在)。 |
| name= | 创建、删除或修改用户的名称。 |
| non_unique | (可选)当与-u选项一起使用时,该选项允许将用户ID更改为非唯一值。 |
| password | (可选)将用户密码设置为此加密值。 |
| remove | 当与“state = absent”一起使用时,行为与“userdel --remove”一样。 |
| shell | 可选择设置用户的shell。 |
| ssh_key_bits | 可选择指定要创建的SSH密钥中的位数。 |
| ssh_key_comment | (可选)定义SSH密钥的注释。 |
| ssh_key_file | (可选)指定SSH密钥文件名。 |
| ssh_key_passphrase | 设置SSH密钥的密码。如果没有提供密码,SSH密钥将默认没有密码。 |
| ssh_key_type | (可选)指定要生成的SSH密钥的类型。可用的SSH密钥类型将取决于目标主机上的实现。 |
| state | 帐户是否应该存在。当“absent”时,删除用户帐户。 |
| system | 创建帐户时,将其设置为“yes”后,将使用户成为系统帐户。现有用户无法更改此设置。 |
| uid | 可选择地设置用户的“UID”。 |
| update_password | 如果不同,“always”会更新密码。'on_create'只会为新创建的用户设置密码。 |
例如:
[root@host01 ~]# ansible web -m user -a "name=uoser system=yes uid=1000 group=uoser groups=uoser shell=/bin/bash home=/home/uoser password=DuPy_9ton"
cron模块
cron模块被用来定时执行计划任务。
表6.7cron模块参数说明
| 参数 | 描述 |
|---|---|
| backup | 如果为yes,那么在修改之后会进行备份,备份的路径在“backup_file”中。 |
| cron_file | 如果指定,请在cron.d中使用此文件,而不是单个用户的crontab。 |
| day | 工作应该运行的月份的第几天(1-31,,/2等)。 |
| hour | 工作应该运行的小时(0-23,, / 2等)。 |
| job | 执行命令。如果state =present则为必需。 |
| minute | 工作应该运行一分钟(0-59,,/2等)。 |
| month | 工作应该运行的一个月(1-12,,/2等)。 |
| name | crontab条目的说明。 |
| state | present(不存在就添加;存在,且如果是注释状态就取消状态启动此定时任务),absent为删除定时任务。 |
| user | crontab应该修改的具体用户。 |
| weekday | 工作应该运行的星期几(周六至周六为0-6)。 |
例如:
[root@localhost~]# ansible all -m cron -a 'name="modify time" minute=*/3 user=uoser job="/usr/sbin/ntpdate 0.uos.pool.ntp.org"'

:::note ■name:为定时任务的名称,也就是定时任务的注释。 :::
■minute:为分钟。hour为小时、day为天、month为月、weekday为星期,它们默认都为*。
■user:将定时任务添加到哪个用户的定时任务中。
■job:里面的内容为定时任务的内容。
script模块
script模块用来在受控端执行本地脚本。
表6.8script模块参数说明
| 参数 | 描述 |
|---|---|
| creates | 一个文件名,当这个文件存在,则该命令不执行。 |
| free_form= | 本地脚本路径。 |
| removes | 远程节点上的文件名,当它不存在时,不会运行此步骤。 |
例如:
[root@localhost~]# ansible all -m script -a "/root/test.sh"
附录
Ansible主要核心部件
■Inventory使用:Inventory是Ansible管理主机信息的配置文件,相当于系统Hosts文件的功能,默认存放在“/etc/ansible/hosts”。在hosts文件中,通过分组来组织设备。Ansible通过Inventory来定义主机和分组,也可以自定义“hosts”文件来管理主机,通过在ansible命令中使用选项-i或--inventory-file来指定“hosts”文件。
表6.1Inventory配置参数
| 参数 | 说明 |
|---|---|
| ansible_ssh_host | SSH目标主机名或IP地址。 |
| ansible_ssh_port | SSH目的端口(默认是22)。 |
| ansible_ssh_user | SSH登录使用的用户名(root)。 |
| ansible_ssh_pass | SSH认证所使用的密码(默认是none,这是不安全的,ansible极力推荐使用--ask-pass选项或使用SSH keys)。 |
| ansible_sudo_pass | SSH认证的sudo用户的密码。 |
| ansible_connection | ansible支持多种transport机制,ansible使用何种连接模式连接到主机,连接类型有local、ssh、docker、paramiko(默认是smart,也就是智能选择)。 |
| ansible_ssh_private_key_file | SSH认证所使用的私钥(默认是none)。 |
| ansible_shell_type | 命令所使用目标系统的shell类型(默认是sh),除非您设置的ansible_shell_executable与默认的sh不兼容,否则您不应该设置这个参数。默认情况下,命令是在sh shell环境风格下运行的,此处可以设置为csh或fish shell。 |
| ansible_python_interpreter | 主机上的python解释器(默认是“/usr/bin/python”)。 |
| ansible_*_interpreter | 如果不是用python编写的自定义模块,可以使用这个参数来指定解释器的路径(如“/usr/bin/ruby”),默认是none。 |
例如:执行cat /etc/ansible/custom_host命令后,显示如下内容。
[uoser]
master_uos ansible_ssh_host=192.168.1.2 ansible_ssh_port=22 ansible_ssh_user=uos ansible_ssh_pass=123456 ansible_shell_type=sh
#master_uos: 主机名
#ansible_ssh_host: 主机IP地址
#ansible_ssh_port: SSH监控端口
#ansible_ssh_user: SSH登录使用的用户名
#ansible_ssh_pass: SSH登录使用的用户名密码
#ansible_shell_type: 命令所使用的shell
■使用方法。
ansible -i /etc/ansible/custom_host all -m shell -a "whoami"
Ansible常用命令
■Ansible-doc:Ansible-doc用来查询ansible模块文档的说明,类似于man命令。针对每个模块都有详细的用法说明及应用案例介绍,语法如下。
ansible-doc [options] [module……]
◆列出支持的模块。
[root@localhost ansible]# ansible-doc -l
◆查询具体模块的信息。
[root@localhost ansible]# ansible-doc ping
■Ansible-playbook:Playbook是ansible用于配置、部署和管理被控节点的工具。其工作机制是通过读取预先编写好的playbook文件实现集中处理任务。playbook由YMAL语言编写,YAML文件的扩展名通常为.yaml或.yml。
◆创建playbook.yml文件
mkdir -p /etc/ansible/playbooks/
cd etc/ansible/playbooks/
vi playbook.yml
◆语法以及内容编写参考指导:https://github.com/ansible/ansible-examples
◆使用playbook.yml
ansible-playbook playbook.yml
■Ansible-console:Ansible-console是Ansible为用户提供的一款交互式工具,用户可在ansible-console虚拟出来的终端上用Ansible内置的命令。
[root@localhost ansible]# ansible-console
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
Welcome to the ansible console.
Type help or ? to list commands.
root@all (0)[f:5]$ help
Documented commands (type help <topic>):
========================================
EOF
a10
a10_server
a10_server_axapi3
a10_service_group
a10_virtual_server
accelerate
aci
aci_aaa_user
aci_aaa_user_certificate
aci_access_port_block_to_access_port
aci_access_port_to_interface_policy_leaf_profile
aci_access_sub_port_block_to_access_port
No comments to display
No comments to display