笔记内容:简单使用ansible-playbook 笔记日期:2018-01-30
1.使用以下命令给客户端安装httpd服务:
[root@server ~]# ansible testhost -m yum -a "name=httpd"
192.168.77.128 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror, langpacks\nLoading mirror speeds from cached hostfile\n * base: mirrors.cn99.com\n * epel: mirrors.tongji.edu.cn\n * extras: mirrors.aliyun.com\n * updates: mirrors.163.com\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.4.6-67.el7.centos.6 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n httpd x86_64 2.4.6-67.el7.centos.6 updates 2.7 M\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 2.7 M\nInstalled size: 9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : httpd-2.4.6-67.el7.centos.6.x86_64 1/1 \n Verifying : httpd-2.4.6-67.el7.centos.6.x86_64 1/1 \n\nInstalled:\n httpd.x86_64 0:2.4.6-67.el7.centos.6 \n\nComplete!\n"
]
}
2.执行以下命令启动httpd服务:
[root@server ~]# ansible testhost -m service -a "name=httpd state=started enabled=yes"
## 然后会输出一堆状态信息,只要第一句为SUCCESS则代表启动成功
注:这里的name是centos系统里的服务名,可以通过chkconfig --list查看到。
其他控制服务的命令:
# 停止服务
[root@server ~]# ansible testhost -m service -a "name=httpd state=stopped"
# 重新启动服务
[root@server ~]# ansible testhost -m service -a "name=httpd state=restarted"
# 重载服务
[root@server ~]# ansible testhost -m service -a "name=httpd state=reloaded"
3.在name后面还可以加上state=installed或removed,加上removed的话,表示卸载这个服务,如果不指定state的值默认是installed:
[root@server ~]# ansible testhost -m yum -a "name=httpd state=removed"
192.168.77.128 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror, langpacks\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.4.6-67.el7.centos.6 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nRemoving:\n httpd x86_64 2.4.6-67.el7.centos.6 @updates 9.4 M\n\nTransaction Summary\n================================================================================\nRemove 1 Package\n\nInstalled size: 9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Erasing : httpd-2.4.6-67.el7.centos.6.x86_64 1/1 \n Verifying : httpd-2.4.6-67.el7.centos.6.x86_64 1/1 \n\nRemoved:\n httpd.x86_64 0:2.4.6-67.el7.centos.6 \n\nComplete!\n"
]
}
[root@server ~]#
然后到客户端上通过rpm -qa httpd命令查看是否已卸载成功:
[root@client ~]# rpm -qa httpd
[root@client ~]#
Ansible文档的使用:
1.列出所有可用的模块命令:
ansible-doc -l
2.查看指定模块的文档,例如我要查看cron模块的文档,可使用以下命令:
ansible-doc cron
ansible-doc后面跟模块名就可以查看该模块的文档。
playbook相当于可以把模块命令都写入到配置文件里面,这样就可以直接执行配置文件了,有点脚本的意思:
[root@server ~]# vim /etc/ansible/test.yml
---
- hosts: testhost
remote_user: root
tasks:
- name: test_playbook
shell: touch /tmp/test.txt
文件格式说明:
编辑完成之后,使用ansible-playbook命令执行该文件:
[root@server ~]# ansible-playbook /etc/ansible/test.yml
PLAY [testhost] ***********************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.77.128]
TASK [test_playbook] ******************************************************************************************************
[WARNING]: Consider using file module with state=touch rather than running touch
changed: [192.168.77.128]
PLAY RECAP ****************************************************************************************************************
192.168.77.128 : ok=2 changed=1 unreachable=0 failed=0
[root@server ~]#
然后到客户端上看看是否有创建test.txt文件:
[root@client ~]# ls -l /tmp/test.txt
-rw-r--r-- 1 root root 0 1月 30 11:58 /tmp/test.txt
[root@client ~]#
如上,代表执行成功。
我们通过一个创建用户的例子,来演示一下playbook里的变量使用方式:
[root@server ~]# vim /etc/ansible/create_user.yml # 编辑内容如下
---
- name: create_user
hosts: testhost
user: root
gather_facts: false
vars:
- user: "test"
tasks:
- name: create user
user: name="{{ user }}"
说明:
执行该文件:
[root@server ~]# ansible-playbook /etc/ansible/create_user.yml
PLAY [create_user] ********************************************************************************************************
TASK [create user] ********************************************************************************************************
changed: [192.168.77.128]
PLAY RECAP ****************************************************************************************************************
192.168.77.128 : ok=1 changed=1 unreachable=0 failed=0
[root@server ~]#
到客户端上看看用户是否已创建:
[root@client ~]# id test
uid=1003(test) gid=1003(test) 组=1003(test)
[root@client ~]#
playbook除了有变量,还有循环语句,以下通过一个简单的例子来演示一下循环的使用方式:
[root@server ~]# vim /etc/ansible/while.yml
---
- hosts: testhost
user: root
tasks:
- name: change mode for files
file: path=/tmp/{{ item }} state=touch mode=600
with_items:
- 1.txt
- 2.txt
- 3.txt
说明:
执行该文件:
[root@server ~]# ansible-playbook /etc/ansible/while.yml
PLAY [testhost] ***********************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.77.128]
TASK [change mode for files] **********************************************************************************************
changed: [192.168.77.128] => (item=1.txt)
changed: [192.168.77.128] => (item=2.txt)
changed: [192.168.77.128] => (item=3.txt)
PLAY RECAP ****************************************************************************************************************
192.168.77.128 : ok=2 changed=1 unreachable=0 failed=0
[root@server ~]#
到客户端上看看文件是否已创建:
[root@client ~]# ll /tmp/*.txt
-rw------- 1 root root 0 1月 30 15:54 /tmp/1.txt
-rw------- 1 root root 0 1月 30 15:54 /tmp/2.txt
-rw------- 1 root root 0 1月 30 15:54 /tmp/3.txt
[root@client ~]#
我们都知道在脚本中循环和条件判断是必不可少的语句,所以在playbook里这两种语句也是有的,循环我们已经介绍完了,接下来我们通过一个简单的创建文件的例子演示一下条件判断语句的使用方式。
我们一般以setup模块收集到的主机信息,来作为判断条件。所以在编写代码之前,我们需要先获取相应的信息,例如我要以ip地址来作为判断条件,那么我就得先从setup里获取主机ip的相关信息。
执行以下命令可以查看到setup收集到的所有的facter信息,输出的信息是JSON格式的:
ansible testhost -m setup
编写文件内容如下:
[root@server ~]# vim /etc/ansible/when.yml
---
- hosts: testhost
user: root
gather_facts: True
tasks:
- name: use when
shell: touch /tmp/when.txt
when: ansible_eno16777736.ipv4.address == "192.168.77.128"
说明:
执行该文件:
[root@server ~]# ansible-playbook /etc/ansible/when.yml
PLAY [testhost] ***********************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.77.128]
TASK [use when] ***********************************************************************************************************
[WARNING]: Consider using file module with state=touch rather than running touch
changed: [192.168.77.128]
PLAY RECAP ****************************************************************************************************************
192.168.77.128 : ok=2 changed=1 unreachable=0 failed=0
[root@server ~]#
到客户端上看看文件是否已创建:
[root@client ~]# ll /tmp/when.txt
-rw-r--r-- 1 root root 0 1月 30 16:33 /tmp/when.txt
[root@client ~]#
有一种情况就是执行了tasks里面的内容之后,服务器发生了变化,这时我们可能需要执行一些相关的操作。例如我们修改了某个服务的配置文件后,则需要重启一下服务。而handlers就是完成这样的事情的,它相当于编程中的回调函数,当tasks里的内容执行成功后,就会执行handlers里定义的内容。也类似于shell脚本中的&&符号,例如 cat 1.txt && rm -f 1.txt ,当cat 1.txt命令执行成功之后就会执行rm -f 1.txt命令,否则不执行。
下面用一个简单的例子来演示一下handlers的使用方式:
[root@server ~]# vim /etc/ansible/handlers.yml
---
- name: handlers test
hosts: testhost
user: root
tasks:
- name: copy file
copy: src=/etc/passwd dest=/tmp/test_passwd.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "This is a test string" >> /tmp/test_passwd.txt
说明:
执行该文件:
[root@server ~]# ansible-playbook /etc/ansible/handlers.yml
PLAY [handlers test] ******************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.77.128]
TASK [copy file] **********************************************************************************************************
changed: [192.168.77.128]
RUNNING HANDLER [test handlers] *******************************************************************************************
changed: [192.168.77.128]
PLAY RECAP ****************************************************************************************************************
192.168.77.128 : ok=3 changed=2 unreachable=0 failed=0
[root@server ~]#
到客户端上看看文件末尾的那一行是否是我们echo进去的那一行内容:
[root@client ~]# tail -n1 /tmp/test_passwd.txt
This is a test string
[root@client ~]#