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
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
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.
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.