Puis-je informer le gestionnaire dans un autre rôle? Que dois-je faire pour que ansible le trouve?
Le cas d'utilisation est, par exemple, Je souhaite configurer un service, puis le redémarrer s'il est modifié. Différents systèmes d'exploitation ont probablement différents fichiers à modifier et même le format de fichier peut être différent. Je voudrais donc les placer dans différents rôles (car le format de fichier peut être différent, cela ne peut pas être fait en définissant group_vars). Mais le moyen de redémarrer le service est le même, en utilisant service
module; je voudrais donc mettre le gestionnaire à common
rôle.
Est-ce que pour y parvenir? Merci.
Vous pouvez également appeler les gestionnaires d'un rôle dépendance. Peut être plus propre que d'inclure des fichiers ou de lister explicitement les rôles dans un livre de jeu uniquement dans le but d'une relation de rôle à rôle. Par exemple.:
roles/my-handlers/handlers/main.yml
---
- name: nginx restart
service: >
name=nginx
state=restarted
rôles/mon-autre/meta/main.yml
---
dependencies:
- role: my-handlers
rôles/mon-autre/taches/main.yml
---
- copy: >
src=nginx.conf
dest=/etc/nginx/
notify: nginx restart
Vous devriez pouvoir le faire si vous incluez le fichier de gestionnaire.
Exemple:
handlers:
- include: someOtherRole/handlers/main.yml
Mais je ne pense pas que c'est élégant.
Une façon plus élégante consiste à avoir une pièce qui gère les deux rôles, comme ceci:
- hosts: all
roles:
- role1
- role2
Cela permettra aux deux rôles d'appeler d'autres gestionnaires.
Mais encore une fois, je suggèrerais de faire tout cela dans un seul rôle, séparer les fichiers et utiliser un include conditionnel http://docs.ansible.com/playbooks_conditionals.html#conditional-imports
J'espère que ça t'as aidé
J'avais un problème similaire, mais je devais prendre plusieurs mesures dans les autres rôles dépendants.
Donc plutôt que d’invoquer le gestionnaire - nous posons un fait comme ceci:
- 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
Puis ailleurs dans un autre rôle:
- name: restart services if source code was upgraded
command: /bin/true
notify: restart mylib server
when: mylib_source_upgraded
Vous pouvez importer des gestionnaires supplémentaires à partir de YourRole/handlers/main.yml
fichier en utilisant import_tasks
.
Donc, si MyRole
a besoin d'appeler des gestionnaires dans certains OtherRole
, roles/MyRole/handlers/main.yml
va ressembler à ceci:
- import_tasks: roles/OtherRole/handlers/main.yml
Bien sûr roles/MyRole/handlers/main.yml
peut également inclure des gestionnaires supplémentaires.
De cette façon, si je veux exécuter MyRole
sans exécuter les tâches du OtherRole
, ansible pourra importer et exécuter correctement les gestionnaires à partir du OtherRole