Comment obtenir un Ansible case pour exécuter qu'une seule fois dans un playbook?
Comme une protection contre l'utilisation de la vétusté playbook, je tiens à vous assurer que j'ai une copie à jour du git checkout avant Ansible est autorisé à modifier quoi que ce soit sur les serveurs.
C'est de cette façon que j'ai tenté de le faire. Cette action est située dans un fichier inclus par tous les play livres:
- name: Ensure local git repository is up-to-date
local_action: git pull
register: command_result
failed_when: "'Updating' in command_result.stdout"
Le problème est que cette commande est exécutée une fois pour chaque nœud Ansible se connecte, au lieu d'une seule fois pour chaque playbook exécuter. Comment puis-je l'éviter?
OriginalL'auteur Dag Høidahl | 2014-02-27
Vous devez vous connecter pour publier un commentaire.
Mis à jour
Quand j'ai écrit ma réponse (2014-02-27), Ansible n'avait pas de prise en charge intégrée pour l'exécution d'une tâche qu'une seule fois par playbook, pas une fois par hôte affecté que le playbook a été exécuté. Cependant, comme tlo écrit, le soutien à cette a été introduit avec
run_once: true
dans Ansible version 1.7.0 (sorti sur 2014-08-06). Avec cette fonctionnalité, l'exemple de la définition du travail à partir de la question doit être modifié pourpour accomplir ce qui est demandé.
Réponse Originale À Cette Question
[La réponse suivante a été ma proposition de solution pour le problème particulier de s'assurer que l'git branch est mis à jour avant Ansible exécute les tâches d'un playbook.]
J'ai écrit ce qui suit Ansible rappel plugin qui permettra d'éviter la playbook de l'exécution si la branche git est hors de synchronisation (est soit derrière ou a divergé) avec la télécommande de la branche. Pour l'utiliser, placez le code suivant dans un fichier, comme
callback_plugins/require_updated_git_branch.py
dans votre top-niveau Ansible playbook répertoire:Par exemple, lorsque la branche locale est derrière la branche distante, la commande
ansible-playbook site.yml
s'arrête au début avec la sortie suivante:Et, comme la vache suggère, pour désactiver cette case, vous pouvez exécuter la commande suivante:
Cette solution ne résout pas le problème général d'éviter d'exécuter n'importe quel Ansible tâche plus d'une fois, indépendamment du nombre d'hôtes impliqués, mais il assure que obsolètes tablettes playbook ne sont pas exécutées, et il gère la préoccupation que vous avez mentionné au sujet de mon alias de base de suggestion.
OriginalL'auteur Martin Thorsen Ranang
Depuis la version 1.7 de l'Ansible vous pouvez utiliser
run_once: true
uniquement l'exécution d'une tâche une seule fois et sur un seul hôte.OriginalL'auteur tlo