是否有可能在 Ansible 中拥有真正的全局处理程序,以便我可以从任何剧本的任何角色的任何任务“通知”处理程序?无需明确导入。
我只想定义一次处理程序(比如“重新启动 httpd”)并使其可用于任何地方的任何“通知”指令。
谢谢!
答案1
您可以在剧本中定义处理程序,而不是在角色中定义。剧本中定义的处理程序将可用于该剧本下的所有任务/角色。
如果您愿意,您也可以在处理程序部分使用导入。
---
- hosts: all
handlers:
- import_tasks: global_handlers.yml
tasks:
- shell: echo "Hello World"
notify: some thing from global_handlers
请注意,您需要一个“静态包含”(每个 https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#handlers-running-operations-on-change),因此import_tasks
必须使用而不是include_tasks
:
您无法通知在包含内定义的处理程序。从 Ansible 2.1 开始,这确实有效,但是包含必须是静态的。
答案2
至少有两种方法可以实现这一点;但我不清楚最佳做法是什么。
解决方案 1
一建议做法是仅为处理程序创建一个文件,并将其包含或导入到您的剧本中(看到差异这样,所有角色都可以受益。
例如,假设您有一个文件myhandlers.yml
,其中有一个处理程序用于重新启动 apache,另一个处理程序用于重新加载 mysqld。
然后,在你的剧本中:
- name: Testing 123
hosts: localhost
handlers:
- name: Here are my custom common handlers
# You can also look at include_tasks: handlers.yml
import_tasks: handlers.yml
tasks:
- command: "true"
notify: restart-apache
- command: "true"
notify: restart-mysql
解决方案 2
另一种干净的方法是创建一个专用角色(roles/myhandlers/
例如),并使该角色成为所有其他角色的依赖项。
dependencies:
- myhandlers
有关依赖项的更多信息这里。