ansible是一个开源的IT自动化配置部署,管理的工具。
ansible是新出现的自动化运维工具,基于python开发,集合了众多运维工具puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身并没有批量部署的能力,真正具有批量部署的是ansible所运行的模块。
1)加载自己的配置文件,默认/etc/ansible/ansible.cfg
2)查找对应主机配置文件,找到要执行的主机或组
3)加载ansible命令中对应的应用模块文件
4)通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
5)对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
6)给文件 +x 执行权限;
7)执行并返回结果;
8)删除临时py文件,sleep 0退出;
[root@ansible ~]# yum -y install epel-release --nogpgcheck ##安装epel源
[root@ansible ~]# yum -y install ansible
[root@ansible ~]# ansible --version ## 查看ansible的版本信息
ansible 2.9.16
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)]
vi /etc/ansible/hosts ## 在主机清单中添加主机节点地址
[apache]
192.168.10.20
[mysql]
192.168.10.30
ssh-keygen -t rsa
ssh-copy-id 192.168.10.20
ssh-copy-id 192.168.10.30 ## 配置密钥对认证
ssh-agent bash ## 配置免交互代理
ssh-add
ansible的命令格式
命令格式:ansible [主机] [-m 模块] [-a args]
ansible-doc -l //列出所有已安装的模块 注:按q退出
ansible-doc -s [模块] //-s列出模块描述信息和操作动作
command模块可以帮助我们在远程主机上执行命令
[root@ansible ~]# ansible apache -m command -a 'pwd' //指定主机或者ip执行date
192.168.10.20 | CHANGED | rc=0 >>
/root
[root@ansible ~]# ansible all -a 'pwd' //如果不加-m模块,则默认运行command模块 all表示所有hosts主机执行命令
192.168.10.20 | CHANGED | rc=0 >>
/root
192.168.10.30 | CHANGED | rc=0 >>
/root
管理远程主机中的计划任务
常用参数参数:
[root@ansible ~]# ansible apache -m cron -a 'minute="*/1" job="/usr/bin/echo this is test cron >> /opt/test.txt" name="test cron"' //利用ansible制定一个任务计划,每隔一分钟在/opt/test.txt的文件中写入this is test cron
[root@ansible ~]# ansible apache -a 'crontab -l' // 查看apache这个主机上的任务计划
192.168.10.20 | CHANGED | rc=0 >>
#Ansible: test cron
*/1 * * * * /usr/bin/echo this is test cron >> /opt/test.txt
[root@apache opt]# cat test.txt //在apache这个节点上也能看到写入的内容
this is test cron
this is test cron
this is test cron
this is test cron
[root@ansible ~]# ansible apache -m cron -a 'name="test cron" state=absent' //移除指定name的任务计划,假如该计划任务没有取名字,name=None即可
user 模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
[root@ansible ~]# ansible apache -m user -a 'name="lisi"' //在apache节点上创建lisi这个用户
[root@ansible ~]# ansible apache -a 'tail /etc/passwd' //查看apache上是否创建了lisi用户
...
...
lisi:x:1001:1001::/home/lisi:/bin/bash
[root@ansible ~]# ansible apache -m user -a 'name="lisi" state=absent' //删除lisi这个用户
group 模块可以帮助我们管理远程主机上的组
[root@ansible ~]# ansible apache -m group -a 'name="apache" gid=333 system=yes' //创建apache这个组
[root@ansible ~]# ansible apache -a 'tail /etc/group' //查看apache节点上是否生成apache这个组
...
...
apache:x:333:
[root@ansible ~]# ansible apache -m user -a 'name="lisi" uid=222 system=yes group=apache' //利用user模块将lisi用户添加进apache这个组里
[root@ansible ~]# ansible apache -a 'tail /etc/passwd' //查看是否生成的用户lisi
lisi:x:222:333::/home/lisi:/bin/bash
[root@ansible ~]# ansible apache -a 'id lisi' //查看lisi用户的信息
192.168.10.20 | CHANGED | rc=0 >>
uid=222(lisi) gid=333(apache) 组=333(apache)
copy 模块的作用就是拷贝文件
常用参数:
[root@ansible ~]# ansible apache -m copy -a 'src=/opt/1.txt dest=/opt/1.txt.bak owner=root mode=755' //在ansible主机opt目录下创建1.txt,用ansible_copy模块拷贝到apache节点上
[root@ansible ~]# ansible apache -a 'cat /opt/1.txt.bak' // 验证效果
192.168.10.20 | CHANGED | rc=0 >>
hello world
[root@ansible ~]# ansible apache -m copy -a 'content="hello world" dest=/opt/2.txt' //将hello world写入到指定的目录中
[root@ansible ~]# ansible apache -a 'cat /opt/2.txt'
192.168.10.20 | CHANGED | rc=0 >>
hello world
file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。
[root@ansible ~]# ansible apache -m user -a 'name=apache system=yes' //创建一个apache用户
[root@ansible ~]# ansible apache -m group -a 'name=apache system=yes' //创建一个apache的组
[root@ansible ~]# ansible apache -m file -a 'owner=apache group=apache mode=644 path=/opt/2.txt' //设置文件的属主属组权限等
[root@ansible ~]# ansible apache -m file -a 'path=/opt/1.txt src=/opt/2.txt state=link' //设置/opt/1.txt为/opt/2.txt的链接文件
[root@ansible ~]# ansible apache -m file -a 'path=/opt/1.txt.bak state=absent' //删除apache节点上的一个文件
[root@ansible ~]# ansible apache -m file -a 'path=/opt/1.txt state=touch' //在apache节点上创建一个文件
[root@ansible ~]# ansible apache -m file -a 'path=/opt/temp state=directory mode=755' //在apache节点上创建一个目录
测试主机之间的连通性
[root@ansible ~]# ansible all -m ping
192.168.10.20 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.10.30 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
yum 模块可以帮助我们在远程主机上通过 yum 源管理软件包。
常用参数
name参数:必须参数,用于指定需要管理的软件包,比如 nginx。
state参数:用于指定软件包的状态 ,默认值为。present,表示确保软件包已经安装,除了。present,其他可用值有 installed、latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包。
disable_gpg_check参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。
enablerepo参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。
enablerepo 参数和 disablerepo 参数可以同时使用。
[root@ansible ~]# ansible apache -m yum -a 'name=httpd' //yum安装apache
[root@ansible ~]# ansible apache -m yum -a 'name=httpd state=absent' //yum卸载apache
[root@ansible ~]# ansible apache -a 'systemctl status httpd' //查看apache节点上apache的运行状态
[root@ansible ~]# ansible apache -m service -a 'name=httpd enabled=true state=started' //启动apache服务,并设置开机自启
chdir:指定工作目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中
creates:指定一个文件,当指定的文件存在时,就不执行对应的命令
removes:使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令
[root@ansible ~]# ansible apache -m shell -a 'chdir=/opt/temp echo this is test1 > 1.txt' //在apache节点上/opt/temp目录下创建一个内容是this is test1的文件
[root@ansible ~]# ansible apache -m shell -a 'chdir=/opt/temp cat 1.txt'
192.168.10.20 | CHANGED | rc=0 >>
this is test1
script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。
vi 1.sh //在ansible管理端创建脚本
#!/bin/bash
echo "this is test script" > /opt/script.txt
chmod +x test.sh
ansible mysql -m script -a '1.sh'
[root@ansible ~]# ansible apache -a 'cat /opt/script.txt'
192.168.10.20 | CHANGED | rc=0 >>
this is test script
setup 模块用于收集远程主机的一些基本信息。
filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。
[root@ansible ~]# ansible apache -m setup //获取mysql组主机的facts信息
[root@ansible ~]# ansible apache -m setup -a 'filter=ansible_all_ipv4_addresses' //用filter参数进行筛选,获取apache节点的ipv4地址
192.168.10.20 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.122.1",
"192.168.10.20"
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可以通过Dynamic Inventory动态生成
一般主机名使用FQDN(FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。)
inventory变量参数
参数 说明