Hoe kan ik doorgaan met de uitvoering van een mislukte taak na het oplossen van een fout in het playbook?

Bij het schrijven en debuggen van Ansible-playbooks is de typische workflow als volgt:

  1. ansible-playbook ./main.yaml
  2. Playbook mislukt bij sommige taken
  3. Repareer deze taak en herhaal regel 1, wacht tot alle voorgaande taken opnieuw zijn uitgevoerd. Wat veel tijd kost

Idealiter zou ik de uitvoering van een mislukte taak willen hervatten, met inventaris en alle feiten verzameld door eerdere taken. Is het zelfs mogelijk? Hoe maak je het schrijven/debuggen van een playbook sneller?


Antwoord 1, autoriteit 100%

Bekijk Playbooks uitvoeren voor het oplossen van problemen.
Als je je playbook bij een bepaalde taak wilt uitvoeren, kun je dat doen met de optie --start-at-task:

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

Het bovenstaande zal beginnen met het uitvoeren van je playbook bij een taak genaamd “install packages”.

U kunt ook dit eerdere antwoord bekijken Hoe u slechts één taak uitvoeren in ansible playbook?

Ten slotte, als een toneelstuk mislukt, krijg je meestal iets in de trant van:

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

Gebruik dat --limitcommando en het zou de mislukte taak opnieuw moeten proberen.


Antwoord 2, autoriteit 46%

Toekomstige lezers:

De --limit @/home/user/site.retryzou in een dergelijk scenario niet helpen, de .retryslaat alleen de mislukte host op en niets meer, zal dus gewoon alle taken uitvoeren tegen mislukte hosts.

Als je de nieuwste versie (Ansible 2.x) gebruikt, werkt de --start-at-taskniet voor taken die zijn gedefinieerd binnen roles.

Je kunt een soortgelijk effect bereiken door gewoon de vlag --stepte gebruiken, bijvoorbeeld: ansible-playbook playbook.yml --step. De stap vraagt ​​u verder voordat u elke taak uitvoert en u kunt (N)o/(y)es/(c)ontinuekiezen.

Met deze aanpak voer je selectief taken uit wanneer dat nodig is en ga je ook verder vanaf het punt waar het mislukte, na reparaties.


Antwoord 3, autoriteit 7%

Toekomstige toekomstige lezers:

Vanaf Ansible 2.4.2.0 --start-at-taskwerkt voor taken die zijn gedefinieerd in rollen die ik heb gemaakt.

Het ansible-team is niet bereid om dit probleem aan te pakken, ze stellen voor dat je je rollen idempotent houdt en het hele stuk opnieuw speelt, ik heb hier geen tijd voor. In mijn rollen gebruik ik niet een enorme hoeveelheid feiten zoals @JeremyWhiting, dus voor mij kan ik deze --start-at-task-functie gebruiken.

Toch is dit een handmatige taak, dus in plaats daarvan heb ik wat ansible rpm geschreven en een “Hervatten”-functie toegevoegd die deze basisstappen volgt:

  • Schakel het ansible-logboek in via /etc/ansible/ansible.cfg (uncomment log_path)
  • Wis het logboek voor elke run
  • Na een fout grijpt de functie “Resume” dit log voor de laatste “TASK”-regel en gebruikt sed om te krijgen wat er in de “[]” staat
  • Vervolgens roept het gewoon de laatste run aan, met –start-at-task=”$start_at_task”
  • Zorg ervoor dat je “any_errors_fatal: true” in je rollen hebt om het spel te stoppen bij de mislukte taak waarvan je wilt hervatten

Het ansible-team is niet bereid om deze basis (en zeer nuttige) functie te maken, dus de enige keuze is om het samen te hacken via enkele bash-scripts.

Other episodes