Puis-je notifier le gestionnaire dans un autre rôle? Que dois-je faire pour que ansible le trouve?
Le cas d’utilisation est, par exemple, je veux configurer un service et le redémarrer si modifié. Différents systèmes d’exploitation ont probablement des fichiers différents à modifier et même le format de fichier peut être différent. Donc, je voudrais les mettre dans des rôles différents (parce que 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 le module de service
; donc je voudrais mettre le gestionnaire à common
rôle common
.
Est-ce que de toute façon pour y parvenir? Merci.
Vous pouvez également appeler des gestionnaires d’un rôle de dépendance . Peut être plus propre que d’inclure des fichiers ou de lister explicitement les rôles dans un livret de jeu uniquement dans le cadre d’une relation de rôle à rôle. Par exemple:
rôles / my-handlers / handlers / main.yml
--- - name: nginx restart service: > name=nginx state=restarted
rôles / my-other / meta / main.yml
--- dependencies: - role: my-handlers
rôles / my-other / tasks / main.yml
--- - copy: > src=nginx.conf dest=/etc/nginx/ notify: nginx restart
Vous devriez pouvoir le faire si vous incluez le fichier du gestionnaire.
Exemple:
handlers: - include: someOtherRole/handlers/main.yml
Mais je ne pense pas que ce soit élégant.
Une façon plus élégante est d’avoir un jeu qui gère les deux rôles, quelque chose 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 tout faire en un seul rôle et de séparer les fichiers et d’utiliser un élément conditionnel: http://docs.ansible.com/playbooks_conditionals.html#conditional-imports
J’espère que cela pourra aider
J’avais un problème similaire, mais j’avais besoin de prendre de nombreuses actions dans les autres rôles dépendants.
Donc, plutôt que d’invoquer le handeler, nous établissons un fait comme ça:
- 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 du fichier YourRole/handlers/main.yml
en utilisant import_tasks
.
Donc, si MyRole
doit appeler des gestionnaires dans OtherRole
, roles/MyRole/handlers/main.yml
ressemblera à ceci:
- import_tasks: roles/OtherRole/handlers/main.yml
Bien sûr, roles/MyRole/handlers/main.yml
peut également inclure des gestionnaires supplémentaires.
Ainsi, si je veux exécuter MyRole
sans exécuter de tâches depuis OtherRole
, ansible pourra importer et exécuter correctement les gestionnaires de OtherRole