Comment exécuter ansible sur un hôte à la fois et interrompre en cas d'échec

15

J'ai un playbook Ansible où je veux mettre à jour un certain nombre d'appareils feuilletés en séquence. Je peux l'utiliser serial:1, mais je veux arrêter complètement le playbook si j'obtiens un échec afin de pouvoir le corriger avant de continuer au lieu d'accumuler des erreurs.

Je voudrais également redémarrer le playbook sur le même hôte sur lequel je me suis arrêté. Utilise actuellement Ansible v2.0, mais peut également basculer vers une version plus récente si ce type de fonctionnalité n'est disponible que dans les versions plus récentes.

Peter Turner
la source

Réponses:

15

Votre playbook s'arrêtera en cas d'échec et vous utilisez serial: 1selon la documentation .

Par défaut, Ansible continuera d'exécuter des actions tant qu'il y a des hôtes dans le groupe qui n'ont pas encore échoué.

Cela dit, il semble y avoir une certaine confusion dans la communauté au sujet du comportement par défaut, et il semble avoir changé - ou été bogué - quelque part entre 1.8 et 2.1.

Donc, si serial: 1cela ne suffit pas, utilisez ce paramètre supplémentaire:

max_failure_percentage: 0

Dans certaines situations, comme avec les mises à jour continues décrites ci-dessus, il peut être souhaitable d'interrompre la lecture lorsqu'un certain seuil d'échecs a été atteint. Pour ce faire, à partir de la version 1.3, vous pouvez définir un pourcentage d'échec maximum ...

==

En ce qui concerne la nouvelle tentative de votre playbook, vous devriez voir un message d'échec comme celui-ci:

to retry, use: --limit @/home/user/site.retry

Utilisez ce --limitdrapeau et sur votre prochaine exécution de ansible-playbooket il continuera d'où il a échoué.

Les fichiers de nouvelle tentative seront créés sauf si vous avez défini retry_files_enabled = Falsevotre configuration.

Alternativement, --start-at-taskpeut également fonctionner.

Sources:

https://github.com/ansible/ansible/issues/1663

https://github.com/ansible/ansible/issues/16241

http://docs.ansible.com/ansible/playbooks_delegation.html#rolling-update-batch-size

http://docs.ansible.com/ansible/playbooks_delegation.html#maximum-failure-percentage

http://docs.ansible.com/ansible/intro_configuration.html#retry-files-enabled

http://docs.ansible.com/ansible/playbooks_startnstep.html#start-at-task

Chasseur des bois
la source
1
Si quelqu'un a une meilleure idée de ce qui est arrivé au changement / bug dans 1.9 et 2.0, faites-le moi savoir et je mettrai à jour cette réponse.
Woodland Hunter
Oui, je sais qu'ansible 2.0 continuera de fonctionner sur d'autres hôtes s'il obtient des échecs sur l'un d'eux. Je suppose que je ne pensais pas que cela aurait un comportement différent si je courais en série: 1. C'est ce que vous dites?
Peter Turner
C'est correct, serial: 1 devrait avoir ce comportement, et si ce n'est pas le cas (parce que ??), ajoutez également max_failure_percentage: 0. Je suggère également de mettre à niveau Ansible car 2.0 avait beaucoup de bugs.
Woodland Hunter
Tellement de bugs, en fait, qu'il vous manque les fichiers .retry en 2.0! github.com/ansible/ansible/issues/13944
Woodland Hunter
Heh, donc je ne suis pas le seul qui corrige constamment la source. C'est bon à savoir.
Peter Turner
2

Dans 2.5+ (bien après la question), il y a le débogueur qui couvre la plupart de cela: https://docs.ansible.com/ansible/latest/user_guide/playbooks_debugger.html

Comme pour un à la fois, l'utilisation de "--forks 1" ne se connecte qu'à un seul système à la fois si vous voulez le faire de manière ponctuelle et pas à chaque fois.

Matt Piechota
la source