学完这一章节,学生能去实现一个任务仅当另一个任务修改了受管主机。
Ansible模块被涉及成幂等性,这意味着一个正常编写的剧本和它的任务能被执行多次而不去修改受管主机,除非它们需要去制造一个改变对受管主机,使其达到一个希望的状态。
然而,有时当一个任务产生了一个变化对主机,一个进一步的任务需要去执行。例如,一个改变针对服务配置文件的改变需要去重新加载服务,以至于配置文件可以生效。
处理程序是响应由其他任务触发的通知的任务,任务只在更改托管主机上的某些内容时通知handlers。每一个handler有一个全局唯一的名字,并且被触发在一个剧本的任务快结尾。如果没有任务通知handler通过名字,handler将不会执行。如果一个或多个任务通知handler,handler将仅执行一次在所有的任务执行完成后。因为handler是任务,管理员可以在handler中使用与其他任务相同的模块。正常,handler被使用去重启主机和重启服务。
handler可以被视为不活动的任务,只有在使用notify语句显式调用时才会触发。下面的代码段展示了Apache服务被重启通过restart apache handler,当apache的配置文件被更新并通知它:
[root@ansible train]# cat handler.yml
---
- name: copy file
gather_facts: no
hosts: localhost
tasks:
- name: copy file①
template:
src: /etc/httpd/conf/httpd.conf.0518
dest: /etc/httpd/conf/httpd.conf
notify:②
- restart apache③
handlers:④
- name: restart apache⑤
service:⑥
name: httpd
state: restarted
在前面的示例中,当任务通知发生更改时,handler将被触发。一个任务可能调用超过一个handler在notify区域。Ansible对待notify语句作为一个数组并且遍历handler名字:
---
- name: copy file
gather_facts: no
hosts: localhost
tasks:
- name: copy file
template:
src: /etc/httpd/conf/httpd.conf.0518
dest: /etc/httpd/conf/httpd.conf
notify:
- restart mysql
- restart apache
handlers:
- name: restart mysql
service:
name: mysqld
state: restarted
- name: restart apache
service:
name: httpd
state: restarted
有一些重要的事情需要去记忆关于使用handlers
handler是为了执行额外的任务当一个任务修改了一个受管主机。它们不应该被用作正常任务的替代品。