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 = False #ssh是否需要输入密码,配置为True时,hosts文件有ansible_password变量也要输入密码
host_key_checking = False #是否校验密钥,第一次连接时需接收的密钥
remote_user = admin #管理被控节点时使用哪个用户
remote_port = 22 #管理被控节点时使用ssh端口
[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