当前位置: 首页 > 工具软件 > Copy Handler > 使用案例 >

Chpater5.2 实现handler

颛孙晗昱
2023-12-01

5.2 实现handler

5.2.1 目标

学完这一章节,学生能去实现一个任务仅当另一个任务修改了受管主机。

5.2.2 Ansible处理程序

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的任务
  • ②notify语句表明任务需要触发一个handler
  • ③执行的handler的名字
  • ④handler关键字表明hander任务列表的开始
  • ⑤handler调用的任务名称
  • ⑥handler使用的模块

在前面的示例中,当任务通知发生更改时,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

5.2.3 使用handlers

有一些重要的事情需要去记忆关于使用handlers

  • handler总是执行已play中handler区域指定的顺序执行。它们不会已任务中notify语句中列出的顺序,或者任务通知它们的顺序执行。
  • handler正常执行在所有其他任务执行完成后,在playbook的任务部分,任务调用的handler将不会运行,直到任务下的所有任务都被处理完成后。(但也有一些例外)
  • handler命名存在于全局的命名空间,如果两个handler被错误的指定了相同的名字,仅仅一个被执行。
  • 即使超过一个任务通知了handler,handler将仅仅执行一次。如果没有任务通知它,handler将不执行。
  • 如果包含notify语句的任务没有报告一个changed结果(例如一个软件包已经是安装状态并且任务报告ok),handler没有被通知。handler被跳过除非另外一个任务通知了它。Ansible通知handler仅当任务报告changed状态。

handler是为了执行额外的任务当一个任务修改了一个受管主机。它们不应该被用作正常任务的替代品。

 类似资料: