playbook核心元素之handlers、notify
playbook核心元素之handlers、notify
教程每周二、四、六更新
我们上面的integration.yml 写的有点随意,现在把它改一下:
[root@m01 ansible]# vim httpconf.yml
---
- hosts: com
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: config httpd
copy:
src: /root/ansible/httpd.conf
dest: /etc/httpd/conf/httpd.conf
- name: start httpd service
systemd: state=started name=httpd
上面的剧本完成了企业中常见的操作,先安装软件包,然后修改配置文件,最后启动服务。如果完成第一遍操作以后,发现配置文件需要进一步优化,这个时候再次执行这个剧本,就会:
-
先安装:但是已经安装过了,这一步不再执行。
-
拷贝配置文件:配置文件被修改过,执行拷贝
-
启动服务:服务已经启动了,无需在启动
我们发现,经过这三步以后,只修改了配置文件,但是没有进行服务的重启,所以这也就无法使修改的配置生效。此时就用到了handlers。我们可以上面的例子改成:
[root@m01 ansible]# cat httpconf.yml
---
- hosts: com
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: config httpd
copy:
src: /root/ansible/httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify: restart httpd
- name: start httpd service
systemd: state=started name=httpd
handlers:
- name: restart httpd
systemd:
state: restarted
name: httpd
handlers相当于处理装置,使用handlers关键字,指明哪些任务可以被'调用',之前说过,handlers是另一种任务列表,你可以把handlers理解成另外一种tasks,你可以理解成它们是'平级'的,所以,handlers与tasks是'对齐'的(缩进相同)。上例中的handlers中只有一个任务,这个任务的名称为"restart httpd",handlers中的任务需要被tasks中的任务调用,那么上例中,很明显,"restart httpd"被"config httpd"调用了。
同时,我们使用notify关键字'调用'handlers中的任务,或者说,通过notify关键字'通知'handlers中的任务,所以,综上所述,上例中的play表示,如果"config httpd"真正的修改了配置文件(实际的操作),那么则执行"restart httpd"任务,如果"config httpd"并没有进行任何实际的改动,则不执行"restart httpd" ,这就是handlers的作用,聪明如你肯定已经明白了,动手执行一下上述playbook试试吧【动手之前先准备好一个可用的/root/ansible/httpd.conf文件,否则会报错】。
handlers是另一种任务列表,所以handlers中可以有多个任务,被tasks中不同的任务notify,例如:
handlers:
- name: restart httpd
systemd:
state=restarted
name=httpd
- name: create a file
file:
path=/data/newfile
state=touch
我们也可以写多个notify,例如:
- hosts: com
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: config httpd
copy:
src: /root/ansible/httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify:
- restart httpd
- check service state
雷哥开通了抖音(云计算雷哥)和微信视频号,求关注!!!和大家一起学习 技术!
推荐阅读
《一站式教程之集群架构》:
看完本文有收获?请分享给更多人
推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!