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

时间:2014-03-26 00:46:15

标签: ansible ansible-playbook

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

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

无论如何要实现这个目标?感谢。

5 个答案:

答案 0 :(得分:63)

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

  • 角色/我的-处理程序/处理程序/ 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
    

答案 1 :(得分:32)

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

示例:

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

但我不认为它优雅。

更优雅的方式是制作一个管理这两种角色的游戏,如下所示:

- hosts: all
  roles:
  - role1
  - role2

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

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

希望有所帮助

答案 2 :(得分:4)

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

所以不是调用handeler而是设置一个这样的事实:

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

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

{{1}}

答案 3 :(得分:2)

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

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

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

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

这样,如果我想在不运行MyRole任务的情况下运行OtherRole,ansible将能够从OtherRole

正确导入和运行处理程序

答案 4 :(得分:0)

目前我使用的是 ansible v2.10.3,它支持在不同的角色上调用 handlers。这是因为 handlers 在播放级别是可见的,如 Ansible Docs 所说。您可以在最底部看到提到的文档。

<块引用>

处理程序是游戏范围的,因此可以在它们定义的角色之外使用。

仅供参考,我测试了解决方案,即调用其他角色的 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)发生更改时,Ansible 会将其发送到远程位置并通知处理程序 rebootvm,然后重新启动 VM。

附言我不知道 Ansible 到底支持哪个版本。

编辑:代码缩进修复