我可以通知其他角色的管理人员吗? 我应该怎样做才能找到它?
用例是,例如,我想配置一些服务,然后在更改后重新启动它。不同的操作系统可能需要编辑不同的文件,甚至文件格式也可能不同。因此,我希望将它们放到不同的角色中(因为文件格式可能不同,所以不能通过设置 group _ vars 来完成)。但是使用 service模块重新启动服务的方法是相同的; 因此我希望将处理程序设置为 common角色。
service
common
无论如何都要做到这一点? 谢谢。
如果包含处理程序文件,则应该能够做到这一点。
例如:
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_tasks从 YourRole/handlers/main.yml文件导入其他处理程序。
import_tasks
YourRole/handlers/main.yml
因此,如果 MyRole需要在某些 OtherRole中调用处理程序,那么 roles/MyRole/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
处理程序具有发挥作用域,因此可以在定义它们的角色之外使用。
仅供参考,我测试了该解决方案,即调用其他角色的 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。
config.conf
rebootvm
另外,我不知道安赛布尔到底支持哪个版本。
编辑: 代码缩进修复