如何编写具有多个任务的 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
为了响应更改,我有多个相关任务应该 运行。 如何编写具有多个任务的 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