Ansible 中的全局处理程序

Ansible 中的全局处理程序

是否有可能在 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

有关依赖项的更多信息这里

相关内容