如何编写具有多个任务的 Ansible 处理程序?

How do I write an Ansible handler with multiple tasks?

为了响应更改,我有多个相关任务应该 运行。 如何编写具有多个任务的 Ansible 处理程序?

例如,我想要一个仅在服务已启动时才重新启动服务的处理程序:

- name: Restart conditionally
  shell: check_is_started.sh
  register: result

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result

在您的处理程序文件中,使用通知将不同的步骤链接在一起。

- name: Restart conditionally
  debug: msg=Step1
  changed_when: True
  notify: Restart conditionally step 2

- name: Restart conditionally step 2
  debug: msg=Step2
  changed_when: True
  notify: Restart conditionally step 3

- name: Restart conditionally step 3
  debug: msg=Step3

然后从 notify: Restart conditionally 的任务中引用它。

请注意,您只能通知低于当前处理程序的处理程序。例如,Restart conditionally step 2 无法通知 Restart conditionally

来源:#ansible irc.freenode.net。我不确定这是否会在未来继续工作,因为它没有作为官方文档中的功能提及。

编辑: 如果您有 Ansible 2.2 或更高版本,请使用 mkadan 的答案。下面的答案不适用于较新版本的 Ansible。另请注意,根据下面 Enis Afgan 的评论,由于错误,此答案不适用于 2.0.2 和 2.1.2 之间的 Ansible 版本。


从 Ansible 2.0 开始,您可以在处理程序中使用包含操作来 运行 多个任务。

例如,将您的任务放在一个单独的文件中 restart_tasks.yml(如果您使用角色,那将进入任务子目录,而不是 在处理程序子目录中) :

- name: Restart conditionally step 1
  shell: check_is_started.sh
  register: result

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result

您的处理程序将只是:

- name: Restart conditionally
  include: restart_tasks.yml

来源:github 上的问题线程:https://github.com/ansible/ansible/issues/14270

从 Ansible 2.2 开始,这个问题有适当的解决方案。

处理程序也可以“收听”通用主题,任务可以按如下方式通知这些主题:

handlers:
    - name: restart memcached
      service: name=memcached state=restarted
      listen: "restart web services"
    - name: restart apache
      service: name=apache state=restarted
      listen: "restart web services"

tasks:
    - name: restart everything
      command: echo "this task will restart the web services"
      notify: "restart web services"

这种用法使得触发多个处理程序变得更加容易。它还将处理程序与其名称分离,从而更容易在剧本和角色之间共享处理程序

具体到问题,这应该有效:

- name: Check if restarted
  shell: check_is_started.sh
  register: result
  listen: Restart processes

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result
  listen: Restart processes

并在任务中,通过 'Restart processes'

通知处理程序

http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change