Ansible 自动化运维工具

Linux / 2020-05-10

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 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.5 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.6 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.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

鄂ICP备19026312号-1