web-dev-qa-db-fra.com

ansible: inclure un rôle dans un rôle?

Est-il possible de réutiliser un rôle dans un rôle? Je ne veux pas dire via la définition d’une dépendance dans le fichier meta/main.yml d’un rôle mais par y compris le rôle dans les tâches/main.yml d’un autre rôle directement?

Par exemple, je définis quelques rôles de base dans des recueils de rôles et quelques rôles de plus haut niveau dans des rôles. Je souhaite que les rôles de haut niveau incluent certains des rôles de base en plus de certaines tâches spécifiques.

playbooks/

  rolebooks/
    some_role/

  roles/
    webtier/
      tasks/
        main.yml

Dans playbooks/roles/webtier/tasks/main.yml:

- Shell: echo 'hello'
- { role: rolebooks/some_role }
- Shell: echo 'still busy'

Merci

58
Michael

Ancienne question BUT pour l'enregistrement : utilisez Ansible 2.2+ et vous êtes prêt à partir avec include_role. Exactement à cette fin ... voir la documentation ici .

Check-out import_role aussi ... voir documentation ici

77
masu

Autant que je sache, vous ne pouvez pas. C'est à quoi servent les dépendances.

Si vous voulez éviter les dépendances (parce que, par exemple, vous voulez que le rôle X s'exécute entre deux tâches), vous pouvez le faire dans le livre de lecture lui-même si vous pensez que les tâches sont liées:

roles/webtier/tasks/main.yml:

- Shell: echo 'hello'
- include: webtier.yml
- Shell: echo 'role done'

Tout dépend de ce que vous essayez de faire exactement. Mais dans votre exemple, "toujours occupé" semble impliquer que le rolebooks/some_role est toujours en cours d'exécution, ce qui n'est pas possible (ici, il n'y a pas de concurrence).

Évidemment, vous pouvez également séquencer les rôles dans un livre de jeu principal (ce que vous faites probablement déjà):

- name: Polite foo stuff
  hosts: foo_hosts
  roles:
    - say_hello
    - rolebooks/some_role
    - say_bye

- name: Unpolite foo stuff
  hosts: !foo_hosts
  roles:
    - rolebooks/some_role
11
leucos

Vous ne pouvez pas, mais vous pouvez faire quelque chose de similaire.

Pour une mise en page de:

roles/
    ...
    common/tasks/main.yml
    nginx/tasks/main.yml
    ...

Dans nginx/tasks/main.yml, vous pouvez appeler votre tâche commune:

- name: Call the 'common' role to do some general setup
  include: ../../common/tasks/main.yml

Notez que, du fait que vous n'utilisez pas la structure d'importation typique, vous risquez de rencontrer des "bizarreries", telles que des variables de rôle par défaut qui ne sont pas accessibles, à moins que vous n'ayez inclus le rôle de manière standard auparavant.

5
user559633

J'apprécie le fait que vous ayez déclaré ne pas utiliser de dépendances méta, mais la meilleure solution que j'ai proposée consiste à créer un rôle qui niquement contient meta/dependency.yml

Cela permet d'inclure n'importe quel nombre de rôles dans le bon ordre.

Assurez-vous de définir allow_duplicates: yes

---
allow_duplicates: yes
dependencies:
  - { role: app-install-rpms,           tags: ['rpms'] }
  - { role: app-Java-config,            tags: ['config'] }
  - { role: app-directories,            tags: ['dirs'] }
  - { role: app-config-site_management, tags: ['site_management'] }
  - { role: app-config-initd,           tags: ['initd'] }
  - { role: Tomcat-boapp,               tags: ['config'] }

Cela nous permet d’appeler un rôle à partir d’un rôle.

2
James Morgan