可以在另一个角色中通知处理程序

我可以通知其他角色的管理人员吗? 我应该怎样做才能找到它?

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

无论如何都要做到这一点? 谢谢。

55062 次浏览

如果包含处理程序文件,则应该能够做到这一点。

例如:

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

但我不觉得它优雅。

一个更优雅的方法是让一部剧同时扮演两个角色,比如:

- hosts: all
roles:
- role1
- role2

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

但是我还是建议把它们放在一个角色和单独的文件中,并使用一个条件包含 http://docs.ansible.com/playbooks_conditionals.html#conditional-imports

希望能帮上忙

还可以调用 依赖性角色的处理程序。可能比仅仅为了角色与角色之间的关系而在剧本中包含文件或明确列出角色要干净。例如:

  • Role/my-handlers/handlers/main.yml

    ---
    - name: nginx restart
    service: >
    name=nginx
    state=restarted
    
  • roles/my-other/meta/main.yml

    ---
    dependencies:
    - role: my-handlers
    
  • roles/my-other/tasks/main.yml

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

我有一个类似的问题,但需要在其他依赖角色中采取许多行动。

因此,与其调用处理程序,不如这样设置一个事实:

- 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

您可以使用 import_tasksYourRole/handlers/main.yml文件导入其他处理程序。

因此,如果 MyRole需要在某些 OtherRole中调用处理程序,那么 roles/MyRole/handlers/main.yml应该是这样的:

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

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

这样,如果我想运行 MyRole而不运行任务从 OtherRole,可视将能够正确地导入和运行处理程序从 OtherRole

目前,我使用的是可测试的 v2.10.3,它支持在不同的角色上调用 handlers。这是因为按照 敏感文件的说法,handlers在游戏层面上是可见的。你可以看到文件中提到,在最底部的一点。

处理程序具有发挥作用域,因此可以在定义它们的角色之外使用。

仅供参考,我测试了该解决方案,即调用其他角色的 handlers,它工作了!不需要导入或其他,只需 确保角色在相同的剧本执行中

举例说明:

  • roles/vm/handlers/main.yaml

    ---
    - name: rebootvm
    ansible.builtin.reboot:
    reboot_timeout: 600
    test_command: whoami
    
  • roles/config-files/tasks/main.yaml

    ---
    - name: Copy files from local to remote
    ansible.builtin.copy:
    dest: /home/ubuntu/config.conf
    src: config.conf
    backup: yes
    force: yes
    notify:
    - rebootvm
    

因此,当配置文件(即 config.conf)发生变化时,Anble 将把它发送到远程位置,并通知处理程序 rebootvm,然后重新启动 VM。

另外,我不知道安赛布尔到底支持哪个版本。

编辑: 代码缩进修复