Ansible notifie les gestionnaires dans un autre rôle

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