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


73

我可以以其他角色通知处理程序吗?我应该怎么做才能使ansible找到它?

用例是,例如,我想配置一些服务,然后在更改后重新启动它。不同的操作系统可能具有不同的文件进行编辑,甚至文件格式也可能不同。因此,我想将它们设置为不同的角色(由于文件格式可能不同,因此无法通过设置group_vars来完成)。但是使用service模块重新启动服务的方法是相同的;所以我想让处理程序common扮演角色。

反正实现了吗?谢谢。


您找到解决方案了吗?
罗伯特

Answers:


74

您还可以调用依赖角色的处理程序。可能比仅出于角色与角色关系的目的在剧本中包含文件或明确列出角色更干净。例如:

  • 角色/我的处理者/处理者/main.yml

    ---
    - name: nginx restart
      service: >
        name=nginx
        state=restarted
    
  • 角色/我的其他/元/main.yml

    ---
    dependencies:
    - role: my-handlers
    
  • 角色/我的其他/任务/main.yml

    ---
    - copy: >
        src=nginx.conf
        dest=/etc/nginx/
      notify: nginx restart
    

6
它对我不起作用。我尝试过ansible-playbook v1.9.0.1
dgellow 2015年

9
不幸的是,即使在2.0处理事件中也严重中断。我已经补上几个错误:○ github.com/ansible/ansible/issues/11694(包括处理器的什么都不做,甚至沉默,如果文件不存在)O github.com/ansible/ansible/issues/11696(ansible 2.0 yum和dnf模块不会触发通知)o github.com/ansible/ansible/issues/11766(在通知时不存在检查的处理程序)
Hubbitus

4
这是一个极好的方法。如果明确提到依赖角色包括其处理程序,则此处的文档(docs.ansible.com/ansible/playbooks_roles.html#role-dependencies)会更有帮助。
thisjustin 2015年

6
这还将运行my_handlers角色中定义的任务。
mdh

2
好吧,我已经将role1作为role2的依赖项,但是我无法从role2解雇role1的处理程序。我收到错误消息:“在主处理程序列表或侦听处理程序列表中均未找到所请求的处理程序……”。
迭戈·奥古斯托·莫利纳

36

如果包含处理程序文件,则应该能够执行此操作。

例:

handlers:
  - include: someOtherRole/handlers/main.yml 

但是我认为它并不优雅。

一种更优雅的方法是让一个戏剧同时管理两个角色,如下所示:

- hosts: all
  roles:
  - role1
  - role2

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

但是,我再次建议将所有内容全部合并为一个角色并使用单独的文件,并使用条件包含 http://docs.ansible.com/playbooks_conditionals.html#conditional-imports

希望能有所帮助


1
在2.6.12上,处理程序不是隐式共享的。至少在我看来。
Deil

1
2014年,mpdehaan 用户:“可以两次定义一个处理程序而不会出现问题,例如“ restart apache”,系统将采用最新的定义。” 但是,我的测试(Ansible 2.9.4)表明,如果定义了具有不同角色的处理程序,则它们都运行,但是如果只定义一次,即使处于不同的角色,它们仍将运行,因此是全球性的 无需从其他角色导入处理程序。
bitinerant '20

9

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

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

- import_tasks: roles/OtherRole/handlers/main.yml

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

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


4

我遇到了类似的问题,但需要在其他从属角色中采取许多行动。

因此,我们没有像调用handeler那样设置一个事实:

- name: install mylib to virtualenv
  pip: requirements=/opt/mylib/requirements.txt virtualenv={{ mylib_virtualenv_path }}
  sudo_user: mylib
  register: mylib_wheel_upgraded

- name: set variable if source code was upgraded
  set_fact:
    mylib_source_upgraded: true
  when: mylib_wheel_upgraded.changed

然后在其他地方扮演另一个角色:

- name: restart services if source code was upgraded
  command: /bin/true
  notify: restart mylib server
  when: mylib_source_upgraded

7
无需设置事实,通过set设置的变量register的寿命与事实相同。
路加·安东斯

1
通过寄存器设置的@LukeAntins变量将通过该模块认为有用的任何“摘要”。将您定义的变量设置为已知值更可预测。它使您的剧本与特定的模块实现以及使用特定的模块生成变量脱钩。
DylanYoung '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.