Skip to main content

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