Ansible通知处理程序的另一个角色

Kan*_* Li 65 ansible ansible-playbook

我可以通过其他角色通知处理程序吗?我该怎么做让ansible找到它?

用例是,例如我想配置一些服务,然后在更改时重新启动它.不同的操作系统可能有不同的文件要编辑,甚至文件格式也可能不同.所以我想把它们放到不同的角色(因为文件格式可能不同,不能通过设置group_vars来完成).但重启服务的方式是相同的,使用service模块; 所以我想把处理程序放到common角色上.

无论如何要实现这一目标?谢谢.

fam*_*kin 68

您还可以调用依赖项角色的处理程序.可能比在文件中包含文件或明确列出角色更简洁,只是为了角色与角色的关系.例如:

  • 不幸的是,即使在2.0处理事件严重破碎.我已经填写了一些错误:o https://github.com/ansible/ansible/issues/11694(包含处理程序什么也不做,如果文件不存在,甚至是沉默)o https://github.com/ansible/ansible/issues/11696(ansible 2.0 yum和dnf模块不会触发通知)o https://github.com/ansible/ansible/issues/11766(On notify不检查处理程序存在) (9认同)
  • 它对我不起作用.我尝试过ansible-playbook`v1.9.0.1`. (6认同)
  • 这也将运行`my_handlers`角色中定义的任务. (5认同)
  • 这是一个很好的方法.如果明确提到依赖角色包含其处理程序,则此处的文档(http://docs.ansible.com/ansible/playbooks_roles.html#role-dependencies)会更有帮助. (4认同)
  • 好吧,我已经将角色 1 作为角色 2 的依赖项,但我无法从角色 2 触发角色 1 的处理程序。我收到错误:“请求的处理程序...在主处理程序列表和侦听处理程序列表中都找不到”。 (2认同)

Dom*_*tro 35

如果包含处理程序文件,则应该能够这样做.

例:

handlers:
  - include: someOtherRole/handlers/main.yml 
Run Code Online (Sandbox Code Playgroud)

但我不认为它优雅.

更优雅的方式是拥有一个管理两个角色的游戏,如下所示:

- hosts: all
  roles:
  - role1
  - role2
Run Code Online (Sandbox Code Playgroud)

这将使两个角色都能够调用其他处理程序.

但我再次建议将其全部放在一个角色和单独的文件中并使用条件包括http://docs.ansible.com/playbooks_conditionals.html#conditional-imports

希望有所帮助


Dim*_* L. 5

您可以YourRole/handlers/main.yml使用来从文件中导入其他处理程序import_tasks

因此,如果MyRole需要在some中调用处理程序OtherRoleroles/MyRole/handlers/main.yml将如下所示:

- import_tasks: roles/OtherRole/handlers/main.yml
Run Code Online (Sandbox Code Playgroud)

当然roles/MyRole/handlers/main.yml也可以包括其他处理程序。

这样,如果我要运行MyRole而不从运行任务,则OtherRoleansible将能够从正确导入和运行处理程序OtherRole