Nous avons décomposé notre espace de travail géant et modifiable en rôles individuels et simples qui peuvent être exécutés seuls. Ils dépendent tous de notre rôle yum qui provisionne les référentiels, etc., et tous les rôles (A, B, C) l'ont répertorié dans leur meta.yml
:
PLAY [Role A] ... TASK [yum-repo ...] PLAY [Role B] ... TASK [yum-repo ...] PLAY [Role C] ... TASK [yum-repo ...]
Cependant, cela provoque l'exécution du rôle yum-repo plusieurs fois lorsque notre playbook de déploiement est exécuté, nous voyons donc plusieurs exécutions du rôle yum-repo
. Nous ne voulons pas qu'il fasse cela, car cela prend juste plus de temps et s'exécute à plusieurs reprises:
Playbook:
- name: Common Roles hosts: things roles: - A - B - C
Résultat: p >
./roles_galaxy/A/meta/main.yml: dependencies: - name: yum-repo src: foo ./roles_galaxy/B/meta/main.yml: dependencies: - name: yum-repo src: foo ./roles_galaxy/C/meta/main.yml: dependencies: - name: yum-repo src: foo
J'ai essayé allow_duplicates = false
dans notre ansible.cfg
, mais je ne pense pas que ce soit la bonne solution car il s'exécute toujours plusieurs fois.
S'il y a plus d'informations nécessaires, je suis plus qu'heureux d'essayer d'en fournir une version nettoyée. Exécution d'ansible-2.5.5 actuellement.
3 Réponses :
Consultez les documents qui couvrent ce sujet (Duplication et exécution des rôles) .
Ansible s'efforce de choisir l'approche la plus efficace et d'éviter d'exécuter un rôle plus d'une fois, à moins que les paramètres qu'il utilise ne soient différents à chaque fois qu'il est déclaré dans votre jeu . Est-ce que chaque fois que votre rôle yum s'exécute, il configure un dépôt yum différent?
Je ne sais pas dans quelle mesure cela serait pertinent dans le cas d'un rôle Yum, mais une stratégie possible consiste à diviser les éléments communs et uniques en un rôle distinct, puis à créer le rôle commun une dépendance du rôle principal . Il en résulte un rôle commun qui est appliqué une fois, puis un nombre quelconque d'appels du rôle principal pour chaque différence de paramètres.
Est-ce que chaque fois que votre rôle yum s'exécute, il configure un repo yum différent? Non, il est configuré pour s'exécuter sans aucune variable, c'est-à-dire tous nos rôles qui appellent le yum Le rôle -repo
a exactement la même chose répertoriée dans meta / main.yml
. J'ai essayé d'ajouter allow_duplicates: false
à tous les fichiers meta.yml
, et cela n'a malheureusement rien changé.
utilisez la variable register chaque fois que vous exécutez un playbook
quelque chose comme
nom: effectuer la première configuration
rôle: abc
s'inscrire: role_abc_var
changed_when: "'La configuration abc a déjà été effectuée' pas dans role_abc_var.stdout"
pour une explication claire, voir
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables. html
En supposant que vous utilisez import_role
et / ou include_role
, jusqu'à La boucle Include_role installe le rôle et les dépendances plusieurs fois est corrigé, je recommande ce qui suit:
import_role
et / ou include_role
. Ceci est également un correctif pour empêcher l'exécution des décisions de rôle avant les tâches de rôle en raison de la règle d'exécution de rôle: - Toutes les dépendances de rôle définies dans les rôles meta / main.yml seront exécutées en premier, sous réserve du filtrage des balises et des conditions. voir docs.ansible.com/ansible/latest/user_guide/ …
Utilisez-vous
import_role
ouinclude_role
? Si tel est le cas, consultez La boucle Include_role installe plusieurs fois le rôle et les dépendances .