我可以以其他角色通知处理程序吗?我应该怎么做才能使ansible找到它?
用例是,例如,我想配置一些服务,然后在更改后重新启动它。不同的操作系统可能具有不同的文件进行编辑,甚至文件格式也可能不同。因此,我想将它们设置为不同的角色(由于文件格式可能不同,因此无法通过设置group_vars来完成)。但是使用service
模块重新启动服务的方法是相同的;所以我想让处理程序common
扮演角色。
反正实现了吗?谢谢。
Answers:
您还可以调用依赖角色的处理程序。可能比仅出于角色与角色关系的目的在剧本中包含文件或明确列出角色更干净。例如:
角色/我的处理者/处理者/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
v1.9.0.1
。
my_handlers
角色中定义的任务。
如果包含处理程序文件,则应该能够执行此操作。
例:
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
我遇到了类似的问题,但需要在其他从属角色中采取许多行动。
因此,我们没有像调用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
register
的寿命与事实相同。