#这是一个安装httpd的playbook.
---
- hosts: httpd-server
remote_user: root
tasks:
- name: 安装httpd
yum: name=httpd state=latest
- name: 复制httpd配置文件
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: 启动httpd并设置为开机自启
service: name=httpd state=started enabled=yes
关于上述playbook的思考?
如果后期ansible端修改了httpd服务的配置文件,需要将新的配置文件同步到被控端并重启httpd服务,那么上述playbook则无法完成此项工作,因为ansible具有幂等性,当配置文件发生修改后,task2会检测到两端文件内容不同(其实是比较文件的md5值),则会将新的配置文件复制到被控端,但是再接下来的task3中ansible发现httpd服务的状态是start且enable,则不会再执行。
解决方法
在playbook中加入notify和handlers
handlers类似于tasks,但是handlers不是顺序执行的,而是通过notify调用执行,只有当notify所在的task发生change时,notify才会调用执行handlers。
---
- hosts: httpd-server
remote_user: root
tasks:
- name: 安装httpd
yum: name=httpd state=latest
- name: 复制httpd配置文件
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- 重启httpd
- name: 启动httpd并设置为开机自启
service: name=httpd state=started enabled=yes
handlers:
- name: 重启httpd
service: name=httpd state=restarted
深入理解notify和handler