web-dev-qa-db-fra.com

Ansible notifier les gestionnaires dans un autre rôle

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.

61
Kan Li

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
    
65
famousgarkin

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é

32
DomaNitro

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
4
stackdump

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

2
Dima L.