RHCE8.0讲义:实施处理程序

来自CloudWiki
跳转至: 导航搜索

ANSIBLE处理程序

背景

Ansible模块设计为具有幂等性。这表示,在正确编写的playbook中,playbook及其任务可以运行 多次而不会改变受管主机,除非需要进行更改使受管主机进入所需的状态。

但有时候,在任务确实更改系统时,可能需要运行进一步的任务。例如,更改服务配置文件时可能 要求重新加载该服务以便使更改的配置生效。

什么是处理程序

处理程序 是响应由其他任务触发的通知的任务

仅当任务在受管主机上更改了某些内容时,任务才通知其处理程序。

每个处理程序具有全局唯一的名称,在playbook中任务块的末尾触发。

何时执行处理程序

  • 如果没有任务通过名称通知处理程序,处理程序就不会运行。
  • 如果一个或多个任务通知处理程序,处理程序 就会在play中的所有其他任务完成后运行一次。因为处理程序就是任务,所以管理员可以在处理程 序中使用他们将用于任何其他任务的模块。通常而言,处理程序被用于重新引导主机和重新启动服务。
  • 处理程序可视为非活动任务,只有在使用notify语句显式调用时才会被触发。

例如:在下列代码片段 中,只有配置文件更新并且通知了该任务时,restart apache处理程序才会重新启动Apache服 务器:

tasks:
  - name: copy demo.example.conf configuration template(1)
    template:
      src: /var/lib/templates/demo.example.conf,template
      dest: /etc/httpd/conf.d/demo.example.conf
    notify:(2)
      - restart apache(3)
handlers:(4)
  - name: restart apache。(5)
    service:(6)
      name: httpd
      state: restarted

(1)通知处理程序的任务。

(2)notify语句指出该任务需要触发一个处理程序。

(3)要运行的处理程序的名称。

(4)handlers关键字表示处理程序任务列表的幵头。

(5)被任务调用的处理程序的名称。

(6)用于该处理程序的模块。

在上例中,restart apache处理程序只有在template任务通知已发生更改时才会触发。

一个 任务可以在其notify部分中调用多个处理程序。

Ansible将notify语句视为数组,并且迭代处理 程序名称:

tasks:
  - name: copy demo.example.conf configuration template
    template:
      src: /var/lib/templates/demo.example.conf,template
      dest: /etc/httpd/conf.d/demo.example.conf
    notify:
      - restart mysql
      - restart apache
handlers:
  - name: restart mysql
    service:
      name: mariadb
      state: restarted
  - name: restart apache
    service:
      name: httpd
      state: restarted

描述使用处理程序的好处

如Ansible文档中所述,使用处理程序时需要牢记几个重要事项:

  • 处理程序始终按照play的handlers部分指定的顺序运行。它们不按在任务中由notify语句列 出的顺序运行,或按任务通知它们的顺序运行。
  • 处理程序通常在相关play中的所有其他任务完成后运行。playbook的tasks部分中某一任务调 用的处理程序,将等到tasks下的所有任务都已处理后才会运行。(这有一些小的例外。)
  • 处理程序名称存在于各play命名空间中。如果两个处理程序被错误地给予相同的名称,则仅会运 行一个。
  • 即使有多个任务通知处理程序,该处理程序依然仅运行一次。如果没有任务通知处理程序,它就 不会运行。
  • 如果包含notify语句的任务没有报告changed结果(例如,软件包已安装并且任务报告

ok),则处理程序不会获得通知。处理程序将被跳过,直到有其他任务通知它。只有相关任务报 告了 changed状态,Ansible才会通知处理程序。

重要

处理程序用于在任务对受管壑机进行更改时执行额外操作。它们不应用作正常任务的 替代。

参考文献

Lji Playbook 简介 — Ansible 文档

https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.himl