我可以通知其他角色的处理程序吗?我应该怎么做才能让ansible找到它?
用例是,例如,我想配置一些服务,然后在更改时重新启动它。不同的操作系统可能有不同的文件要编辑,甚至文件格式也可能不同。所以我想把它们放到不同的角色中(因为文件格式可以不同,不能通过设置group_vars来完成)。但是重启服务的方式是一样的,使用service
module;所以我想让处理程序common
发挥作用。
无论如何要实现这一点?谢谢。
我可以通知其他角色的处理程序吗?我应该怎么做才能让ansible找到它?
用例是,例如,我想配置一些服务,然后在更改时重新启动它。不同的操作系统可能有不同的文件要编辑,甚至文件格式也可能不同。所以我想把它们放到不同的角色中(因为文件格式可以不同,不能通过设置group_vars来完成)。但是重启服务的方式是一样的,使用service
module;所以我想让处理程序common
发挥作用。
无论如何要实现这一点?谢谢。
您还可以调用依赖角色的处理程序。可能比仅出于角色与角色关系的目的而在剧本中包含文件或明确列出角色更干净。例如:
角色/我的处理程序/处理程序/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
如果包含处理程序文件,您应该能够做到这一点。
例子:
handlers:
- include: someOtherRole/handlers/main.yml
但我不认为它优雅。
一个更优雅的方法是拥有一个同时管理两个角色的戏剧,如下所示:
- hosts: all
roles:
- role1
- role2
这将使两个角色都能够调用其他处理程序。
但我再次建议将所有内容集中在一个角色中并单独文件并使用条件包含http://docs.ansible.com/playbooks_conditionals.html#conditional-imports
希望有帮助
YourRole/handlers/main.yml
您可以使用 . 从文件中导入其他处理程序import_tasks
。
因此,如果MyRole
需要在 some 中调用处理程序OtherRole
,roles/MyRole/handlers/main.yml
将如下所示:
- import_tasks: roles/OtherRole/handlers/main.yml
当然roles/MyRole/handlers/main.yml
也可能包括额外的处理程序。
这样,如果我想在MyRole
不从 运行任务的情况下运行OtherRole
,ansible 将能够从 正确导入和运行处理程序OtherRole
我有一个类似的问题,但需要在其他依赖角色中采取许多行动。
因此,与其调用处理程序,不如设置一个事实,如下所示:
- 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
目前我正在使用 ansible v2.10.3,它支持调用handlers
不同的角色。这是因为根据Ansible Docshandlers
的说法,它们在播放级别上是可见的。您可以在最底部看到提到的文档。
处理程序是作用域的,因此可以在定义它们的角色之外使用。
仅供参考,我测试了解决方案,即调用其他角色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。
PS 我不知道 Ansible 到底是什么版本支持这个。
编辑:代码缩进修复