Ansible自动化运维工具

1、Ansible简介

Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

Ansible产品特色:

1.社区活跃
2.支持异构IT机构
3.模块丰富
4.支持自定义模块
5.基于SSH架构
6.部署简单,容易上手

1.1 Ansible作用

1.统一配置管理,模板管理
2.有状态管理
3.批量部署,批量执行命令
4.批量收集主机信息
5.批量分发文件

1.2 学习Ansible注意事项

1.学会看ansible官方文档:https://docs.ansible.com
2.注意ansible使用语法
3.尽量不要用shell模块;ansible有很多模块,多查询资料
4.多看,多学,多做

一个中文的ansible文档:http://www.ansible.com.cn

2、Ansible部署使用

2.1 Ansible安装

Ansible分为控制节点和被控节点,只需在控制节点安装ansible,控制节点ansible通过ssh管理被控节点。

[root@localhost ~]# yum -y install ansible

#查看ansible版本
[root@manager-18 ~]# ansible --version
ansible 2.9.27
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

练习环境:

主机名 IP地址
lb-10 10.0.0.10
lb-11 10.0.0.11
web-12 10.0.0.12
web-13 10.0.0.13
web-14 10.0.0.14
nfs-15 10.0.0.15
backup-16 10.0.0.16
db-17 10.0.0.17
manage-18(控制节点) 10.0.0.18

2.2 Ansiable控制节点环境配置

Ansiable配置文件:

主配置文件:/etc/ansible/ansible.cfg

ansible配置文件加载顺序:
1.首先检测当前目录下的./ansible.cfg文件
2.然后检测当前用户家目录下~/.ansible.cfg文件
3.最后检测/etc/ansible/ansible.cfg文件

Ansiable配置文件修改:

[root@manager-18 ~]# vim /etc/ansible/ansible.cfg
[defaults]
inventory = /etc/ansible/hosts    #主机清单配置文件位置
forks = 5                         #ssh并发数量
ask_pass = True                   #ssh使用密码还是密钥登录
host_key_checking = False         #是否校验密钥,第一次连接时需接收的密钥
remote_user = admin               #管理被控节点时使用哪个用户

[privilege_escalation]            #特权升级模块,获取管理被控节点权限
become=True                       #是否需要切换用户借权
become_method=sudo                #借权的方式
become_user=root                  #借用哪个用户的权限
become_ask_pass=False             #是否需要输入密码

2.3 Inventory主机清单

主机清单的作用是对管理的主机进行分组,方便我们在批量管理时,针对不同分组的主机做不同操作。

主机清单配置:

主机清单配置官方文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

[root@manager-18 ~]# vim /etc/ansible/hosts
[backup]          #主机分组名称
10.0.0.16         #该分组中的主机

[web]
10.0.0.[12:14]    #定义主机范围,表示从10.0.0.12-10.0.0.14

[nfs]
10.0.0.15 ansible_port=22    #为该主机定义ssh端口变量

[sum:children]    #嵌套组(children为关键字)
nfs
web

[web:vars]           #为web主机分组中所有主机定义变量信息
ansible_user=root    #ssh用户
ansible_password=1   #ssh密码
ansible_port=22      #ssh端口

[all:vars]           #为所有主机分组和主机定义变量信息
ansible_user=root
ansible_password=1
ansible_port=22

测试能否与主机清单中主机通信:

#所有主机最好能够使用ssh密钥免密登录

#测试能否连接到主机进行管理
[root@manager-18 ~]# ansible web -m ping
10.0.0.12 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.0.0.13 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.0.0.14 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

#测试所有主机
[root@manager-18 ~]# ansible all -m ping

3、Ansible常用模块

Ansible内置模块官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html

Ansible所有模块官方文档:https://docs.ansible.com/ansible/latest/collections/index_module.html

#命令格式
ansible 主机组 -m 模块名称 -a '模块参数'

#选项
-m        #指定使用什么模块
-a        #指定模块参数
-v        #显示ansible工作流程
-vv       #显示更详细的ansible工作流程
-vvv      #显示再详细的ansible工作流程
-vvvv     #显示非常详细的ansible工作流程

#获取帮助文档
ansible-doc -l        #列出所有模块
ansible-doc "模块名"   #查看模块帮助信息

3.1 ping模块

ping模块用于检查指定节点机器是否连通,用法很简单,不涉及参数,主机如果在线,则回复pong。

#测试能否与web主机组通讯
[root@manager-18 ~]# ansible web -m ping
10.0.0.12 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.0.0.13 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.0.0.14 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

#测试能否与所有主机组通讯
[root@manager-18 ~]# ansible all -m ping

3.2 command简单命令模块

command模块用于在被控节点上执行命令,ansible默认就是使用command模块;command模块有一个缺陷就是不能使用管道符和重定向等功能。

#模块用法
ansible 主机组 -m command -a '要执行的命令(参数)'

#示例
[root@manager-18 ~]# ansible web -m command -a 'ls /root'
10.0.0.13 | CHANGED | rc=0 >>
anaconda-ks.cfg
10.0.0.14 | CHANGED | rc=0 >>
anaconda-ks.cfg
10.0.0.12 | CHANGED | rc=0 >>
anaconda-ks.cfg

3.3 shell万能模块

shell模块用于在被控节点上执行被控节点的脚本和命令;shell模块支持管道符与重定向等功能。

#模块用法
ansible 主机组 -m shell -a '要执行的命令(参数)'

#示例
[root@manager-18 ~]# ansible web -m shell -a 'ls /root > /root/out.txt'
10.0.0.12 | CHANGED | rc=0 >>

10.0.0.13 | CHANGED | rc=0 >>

10.0.0.14 | CHANGED | rc=0 >>

[root@manager-18 ~]# ansible web -m shell -a 'cat /root/out.txt'
10.0.0.12 | CHANGED | rc=0 >>
anaconda-ks.cfg
out.txt
10.0.0.13 | CHANGED | rc=0 >>
anaconda-ks.cfg
out.txt
10.0.0.14 | CHANGED | rc=0 >>
anaconda-ks.cfg
out.txt

3.4 script执行脚本模块

script模块用于在被控节点上执行控制节点的脚本;该模块是无状态管理模块,若重复使用该模块脚本会被重复执行。

#模块用法
ansible 主机组 -m script -a '参数'

#参数
executable     #指定脚本运行语言
creates        #当远程主机上某文件存在时不执行脚本
removes        #当远程主机上某文件不存在时不执行脚本

#示例
#在控制节点编写脚本
[root@manager-18 ~]# cat > /root/echo_hostname.sh << 'EOF'
#!/bin/bash
echo "$HOSTNAME" > /tmp/hostname.out
EOF

[root@manager-18 ~]# chmod +x echo_hostname.sh

#让控制节点脚本在被控节点上执行
[root@manager-18 ~]# ansible web -m script -a '/root/echo_hostname.sh'

#验证
[root@web-12 ~]# cat /tmp/hostname.out 
web-12

#当被控节点"/tmp/hostname.out"文件已经存在则不再重复运行脚本
[root@manager-18 ~]# ansible web -m script -a '/root/echo_hostname.sh creates=/tmp/hostname.out'

3.5 copy拷贝文件模块

copy模块用于将控制节点的文件复制到被控节点,也可将被控节点的文件从一个目录复制到另一个目录。

#模块用法
ansible 主机组 -m copy -a '参数'

#参数
src              #控制节点源文件
dest             #传输至被控节点后文件存放位置
owner            #指定属主
group            #指定属组
mode             #指定权限
directory_mode   #递归指定目录权限
backup           #是否备份
remote_src       #是否将src参数指定为被控节点文件
content          #不可和src同时使用,用于替换文件中的所有内容

#示例
#将控制节点文件传输至被控节点,并指定权限
[root@manager-18 ~]# echo "123" > /root/hzz.txt
[root@manager-18 ~]# ll /root/
总用量 8
-rw-------. 1 root root 1259 11月 23 04:13 anaconda-ks.cfg
-rw-r--r--  1 root root    4 11月 30 11:29 hzz.txt

[root@manager-18 ~]# ansible web -m copy -a 'src=/root/hzz.txt dest=/root/ owner=bin group=bin mode=0444'

#验证
[root@web-12 ~]# ll
总用量 12
-rw-------. 1 root root 1259 11月 23 04:13 anaconda-ks.cfg
-r--r--r--  1 bin  bin     4 11月 30 11:33 hzz.txt
-rw-r--r--  1 root root   24 11月 30 11:02 out.txt

#将控制节点文件传输至被控节点,并对被控节点原文件进行备份
[root@manager-18 ~]# echo "456" > /root/hzz.txt
[root@manager-18 ~]# cat hzz.txt 
456

[root@manager-18 ~]# ansible web -m copy -a 'src=/root/hzz.txt dest=/root/ backup=yes'

#验证
[root@web-12 ~]# ll
总用量 16
-rw-------. 1 root root 1259 11月 23 04:13 anaconda-ks.cfg
-r--r--r--  1 bin  bin     4 11月 30 11:36 hzz.txt
-r--r--r--  1 bin  bin     4 11月 30 11:33 hzz.txt.16376.2021-11-30@11:36:17~
-rw-r--r--  1 root root   24 11月 30 11:02 out.txt

#替换被控节点文件中的内容
[root@manager-18 ~]# ansible web -m copy -a 'content="789" dest=/root/hzz.txt'

#验证
[root@web-12 ~]# cat hzz.txt
789

注意:复制目录时,目录名称后加"/“表示复制目录中的所有文件,目录名称后不加”/"表示复制目录本身和目录中的所有文件。

3.6 file文件相关模块

file模块用于实现创建文件、目录,删除文件、目录,以及对权限进行修改。

#模块用法
ansible 主机组 -m file -a '参数'

#参数
path         #文件路径
owner        #指定属主
group        #指定属组
mode         #指定权限
recurse      #是否递归
state        #指定状态;状态如下
  file       #查看指定文件是否存在,默认此状态
  touch      #创建文件
  directory  #创建目录
  absent     #删除文件或目录

#示例
#查看被控节点文件是否存在
[root@manager-18 ~]# ansible web -m file -a 'path=/root/hzz.txt'

#在被控节点创建一个文件
[root@manager-18 ~]# ansible web -m file -a 'path=/root/zzh.txt state=touch'

#验证
[root@manager-18 ~]# ansible web -m file -a 'path=/root/zzh.txt'

#在被控节点创建一个目录
[root@manager-18 ~]# ansible web -m file -a 'path=/root/dir1 state=directory'

#验证
[root@manager-18 ~]# ansible web -m file -a 'path=/root/dir1'

#在被控节点创建文件或目录时指定权限
[root@manager-18 ~]# ansible web -m file -a 'path=/root/dir2 state=directory owner=bin group=bin mode=0777'

#删除被控节点的文件或目录
[root@manager-18 ~]# ansible web -m file -a 'path=/root/zzh.txt state=absent'

#修改被控节点已经存在的文件权限
[root@manager-18 ~]# ansible web -m file -a 'path=/root/dir1 owner=bin group=bin mode=777'

3.7 group组模块

group模块用于管理被控节点的用户组。

#模块用法
ansible 主机组 -m group -a '参数'

#参数
name       #指定组名
gid        #指定组id
system     #是否是系统组
state      #指定状态
  present  #创建组,默认为此状态
  absent   #删除组

#示例
#在被控节点创建名为www的组指定gid为1000
[root@manager-18 ~]# ansible web -m group -a 'name=www gid=1000'

#验证
[root@web-12 ~]# tail -1 /etc/group
www:x:1000:

#在被控节点创建名为zzz的系统组
[root@manager-18 ~]# ansible web -m group -a 'name=zzz system=yes'

#验证
[root@web-12 ~]# tail -1 /etc/group
zzz:x:996:

#删除被控节点上名为zzz的组,删除组时,组中不能有用户
[root@manager-18 ~]# ansible web -m group -a 'name=zzz state=absent'

3.8 user用户模块

user模块用于管理被控节点的用户账号。

#模块用法
ansible 主机组 -m user -a '参数'

#参数
name        #指定用户名
uid         #指定用户uid
system      #是否为系统用户
comment     #指定用户描述信息
group       #指定基本组(组名),组必须事先存在
shell       #指定用户登录shell
groups      #指定附加组,若原本有附加组则会被清除再添加指定的附加组
append      #和groups一起用,是否额外添加附加组,相当于groupadd -a -G
home        #指定用户家目录位置
create_home #是否创建家目录
password    #指定用户密码,必须是加密后的密码
state       #指定状态
  present   #创建用户,默认此状态
  absent    #删除用户,删除用户时会删除用户基本组
remove      #是否删除用户所有文件,相当于userdel -r

#示例
#在被控节点创建名为www的用户,uid为1000,属于www组,shell为/bin/bash
[root@manager-18 ~]# ansible web -m user -a 'name=www uid=1000 group=www comment="test user" shell=/bin/bash password={{ "123"|password_hash("sha512") }}'

#验证
[root@web-12 ~]# tail -1 /etc/passwd
www:x:1000:1000:test user:/home/www:/bin/bash

#删除被控节点刚刚创建的用户,并删除用户所有文件
[root@manager-18 ~]# ansible web -m user -a 'name=www state=absent remove=yes'

3.9 yum安装软件模块

yum模块用于在被控节点上通过yum管理软件。

#模块用法
ansible 主机组 -m yum -a '参数'

#参数
name          #指定软件名称,多个软件用逗号隔开,可使用通配符
state         #指定状态
  present     #安装软件,默认为此状态
  installed   #安装软件
  latest      #安装最新版本软件,可用于更新
  removed     #卸载软件
  absent      #卸载软件

#示例
#为被控节点安装httpd服务
[root@manager-18 ~]# ansible web -m yum -a 'name=httpd state=latest'

#将被控节点httpd服务卸载
[root@manager-18 ~]# ansible web -m yum -a 'name=httpd state=absent'

3.10 service服务管理模块

service模块用于管理被控节点上的服务。

#模块用法
ansible 主机组 -m service -a '参数'

#参数
name          #指定服务名称
enabled       #是否设置开机自启
state         #指定状态
  reloaded    #重载服务
  restarted   #重启服务
  started     #开启服务
  stopped     #关闭服务

#示例
#开启被控节点httpd服务并设置开机自启
[root@manager-18 ~]# ansible web -m service -a 'name=httpd state=started enabled=yes'

#重启被控节点httpd服务
[root@manager-18 ~]# ansible web -m service -a 'name=httpd state=restarted'

#关闭被控节点httpd服务并取消开机自启
[root@manager-18 ~]# ansible web -m service -a 'name=httpd state=stopped enabled=no'

3.11 mount挂载模块

mount模块用于管理被控节点的挂载和卸载操作。

#模块用法
ansible 主机组 -m mount -a '参数'

#参数
src          #指定要挂在的设备
path         #指定挂载点
fstype       #指定文件系统类型
opts         #指定挂载参数
state        #指定状态
  mounted    #挂载并写入/etc/fstab配置文件
  present    #仅写入/etc/fstab配置文件,不挂载
  absent     #卸载并移除/etc/fstab配置项
  unmounted  #仅卸载,不移除/etc/fstab配置项

#示例
#被控节点挂载nfs共享目录
[root@manager-18 ~]# ansible web -m mount -a 'src=10.0.0.15:/data path=/mnt/data fstype=nfs state=mounted'

#验证
[root@web-12 ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   37G  1.2G   36G    4% /
devtmpfs                 478M     0  478M    0% /dev
tmpfs                    489M     0  489M    0% /dev/shm
tmpfs                    489M  6.7M  482M    2% /run
tmpfs                    489M     0  489M    0% /sys/fs/cgroup
/dev/sda1               1014M  125M  890M   13% /boot
tmpfs                     98M     0   98M    0% /run/user/0
10.0.0.15:/data           37G  1.2G   36G    4% /mnt/data

#被控节点卸载nfs共享目录挂载
[root@manager-18 ~]# ansible web -m mount -a 'path=/mnt/data fstype=nfs state=absent'

#验证
[root@web-12 ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   37G  1.2G   36G    4% /
devtmpfs                 478M     0  478M    0% /dev
tmpfs                    489M     0  489M    0% /dev/shm
tmpfs                    489M  6.8M  482M    2% /run
tmpfs                    489M     0  489M    0% /sys/fs/cgroup
/dev/sda1               1014M  125M  890M   13% /boot
tmpfs                     98M     0   98M    0% /run/user/0

3.12 cron计划任务模块

cron模块用于创建和管理被控节点的计划任务。

#模块用法
ansible 主机组 -m cron -a '参数'

#参数
name          #计划任务名称,也就是注释
minute        #指定分钟,默认*
hour          #指定小时,默认*
day           #指定日,默认*
month         #指定月,默认*
weekday       #指定周,默认*
user          #指定用户
job           #指定需要执行的任务
backup        #是否备份原计划任务文件
disabled      #是否关闭某计划任务
state         #指定状态
  present     #创建计划任务,默认
  absent      #删除计划任务

#示例
//为被控节点创建一个测试计划任务
[root@manager-18 ~]# ansible web -m cron -a 'name="test cron" minute="*/5" job="echo "123" > /tmp/cron.out"'

#验证
[root@web-12 ~]# crontab -l
#Ansible: test cron
*/5 * * * * echo "123" > /tmp/cron.out

#关闭为被控节点创建的测试计划任务,此时该计划任务会被注释
[root@manager-18 ~]# ansible web -m cron -a 'name="test cron" job="echo "123" > /tmp/cron.out" disabled=yes'

#验证
[root@web-12 ~]# crontab -l
#Ansible: test cron
#* * * * * echo "123" > /tmp/cron.out

#将被控节点创建的测试计划任务先备份,再删除;备份放在/tmp目录
[root@manager-18 ~]# ansible web -m cron -a 'name="test cron" job="echo "123" > /tmp/cron.out" backup=yes state=absent'

3.13 archive压缩模块

archive模块用于将被控节点的文件或目录进行打包压缩,压缩包存放于被控节点。

#模块用法
ansible 主机组 -m archive -a '参数'

#参数
path          #指定要打包压缩的文件或目录,可指定多个文件,支持通配符
dest          #指定压缩之后的文件路径和名称
format        #压缩格式,默认采用gz压缩格式
	gz
	bz2
	tar
	xz
	zip
exclude_path  #指定压缩时排除某些文件

#示例
#将被控节点"/tmp"目录进行打包压缩,存放在被控节点用户家目录中
[root@manager-18 ~]# ansible web -m archive -a 'path=/tmp dest=/root/tmp.tgz'

#验证
[root@manager-18 ~]# ansible web -m file -a 'path=/root/tmp.tgz'

3.14 unarchive解压缩模块

unarchive模块用于将控制节点的压缩包解压到被控节点,也可将被控节点的压缩包解压到被控节点。

#模块用法
ansible 主机组 -m unarchive -a '参数'

#参数
src          #指定要解压的压缩包
dest         #指定要解压到哪个路径
remote_src   #是否指定被控节点压缩包,与src一起使用

#示例
#在控制节点压缩家目录
[root@manager-18 ~]# tar -zcvf /tmp/test.tgz /root/

#将控制节点压缩包解压到被控节点
[root@manager-18 ~]# ansible web -m unarchive -a 'src=/tmp/test.tgz dest=/tmp'

#验证
[root@manager-18 ~]# ansible web -m file -a 'path=/tmp/root'

[root@web-12 ~]# ls /tmp/root/
anaconda-ks.cfg  echo_hostname.sh  hzz.txt

3.15 setup获取主机信息模块

setup模块用于收集远程主机的一些基本信息;这些信息用变量的方式表示,我们也叫做事实(facts)变量,事实变量在书写剧本时使用。

#模块用法
ansible 主机组 -m setup -a '参数'

#参数
filter         #指定条件过滤,支持通配符

#示例
#获取被控节点所有主机信息
[root@manager-18 ~]# ansible web -m setup

#获取被控节点主机名信息
[root@manager-18 ~]# ansible web -m setup -a 'filter=ansible_hostname'

Ansible事实变量官方文档:https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html