4
votes

Comment empêcher un rôle de s'exécuter plusieurs fois lorsqu'il est répertorié en tant que dépendance?

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.


1 commentaires

Utilisez-vous import_role ou include_role ? Si tel est le cas, consultez La boucle Include_role installe plusieurs fois le rôle et les dépendances .


3 Réponses :


0
votes

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.


1 commentaires

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



0
votes

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


0 commentaires

2
votes

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:

  1. Ne spécifiez pas vos rôles dépendants comme dépendances.
  2. Ne les spécifiez que dans les appels à import_role et / ou include_role .

1 commentaires

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/ …