web-dev-qa-db-fra.com

Comment continuer l'exécution en cas d'échec de la tâche après la correction d'une erreur dans le livre de jeu?

Lors de l'écriture et du débogage des playbooks Ansible, le flux de travail typique est le suivant:

  1. ansible-playbook ./main.yaml
  2. Playbook échoue dans certaines tâches
  3. Corrigez cette tâche et répétez la ligne 1 en attendant que toutes les tâches précédentes soient exécutées à nouveau. Ce qui prend beaucoup de temps

Idéalement, j'aimerais reprendre l'exécution sur une tâche ayant échoué, disposer de l'inventaire et de tous les faits rassemblés par les tâches précédentes. Est-ce même possible? Comment rendre l'écriture/le débogage de playbook plus rapide?

53
Sergey Alaev

Jetez un oeil à http://docs.ansible.com/playbooks_startnstep.html . Si vous souhaitez commencer à exécuter votre Playbook pour une tâche particulière, vous pouvez le faire avec le --start-at-task option:

ansible-playbook playbook.yml --start-at-task="install packages"

Ce qui précède commencera à exécuter votre livre de jeu sur une tâche nommée "installer les packages" .

Alternativement, jetez un oeil à cette réponse précédente Comment exécuter une seule tâche dans ansible playbook?

Enfin, lorsqu'un jeu échoue, il vous donne généralement quelque chose comme:

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

Utiliser ça --limit commande et il devrait réessayer à partir de la tâche ayant échoué.

41
Mxx

Futurs lecteurs:

Le --limit @/home/user/site.retry _ ne serait d'aucun secours dans un tel scénario, le .retry ne stocke que l'hôte en échec et rien de plus, alors il ne fera qu'exécuter toutes les tâches sur les hôtes en échec.

Si vous utilisez la dernière version (Ansible 2.x), le --start-at-task ne fonctionne pas pour les tâches définies dans roles.

Vous pouvez obtenir un effet similaire en utilisant simplement le --step drapeau par exemple: ansible-playbook playbook.yml --step. L'étape vous demande avant d'exécuter chaque tâche et vous pouvez choisir (N)o/(y)es/(c)ontinue.

Avec cette approche, vous exécutez des tâches de manière sélective en cas de besoin et vous poursuivez également à partir du point où il a échoué, après des correctifs.

23
Segmented

Future Future lecteurs:

À partir de Ansible 2.4.2.0 --start-at-task fonctionne pour les tâches définies dans les rôles que j'ai créés.

L'équipe ansible n'est pas disposée à résoudre ce problème. Elle vous suggère de conserver vos rôles idempotents et de rejouer l'intégralité de la pièce. Je n'ai pas le temps. Dans mes rôles, je n'utilise pas énormément de faits comme @JeremyWhiting, je peux donc utiliser ceci --start-at-task fonctionnalité.

Cependant, comme il s’agit toujours d’une tâche manuelle, j’ai écrit à la place quelques tours par minute et ajouté une fonction "Reprendre" qui suit ces étapes de base:

  • Activer le journal ansible via /etc/ansible/ansible.cfg (décommenter log_path)
  • Effacer le journal avant chaque exécution
  • Après une défaillance, la fonction "Reprendre" insère ce journal dans la dernière ligne "TASK" et utilise sed pour obtenir ce qui se trouve à l'intérieur du "[]".
  • Ensuite, il appelle simplement la dernière lecture, avec --start-at-task = "$ start_at_task"
  • Assurez-vous que vous avez "any_errors_fatal: true" dans vos rôles pour arrêter le jeu à la tâche défaillante dont vous souhaitez reprendre l'exécution.

L'équipe ansible n'est pas disposée à créer cette fonctionnalité de base (et très utile), le seul choix est donc de la pirater via des scripts bash.

1
Trent