it-swarm.com.de

Wie kann ich die Ausführung einer fehlgeschlagenen Aufgabe fortsetzen, nachdem ich einen Fehler im Playbook behoben habe?

Der typische Workflow beim Schreiben und Debuggen von Ansible-Playbooks lautet wie folgt:

  1. ansible-playbook ./main.yaml
  2. Playbook schlägt bei einer Aufgabe fehl
  3. Korrigieren Sie diese Aufgabe und wiederholen Sie Zeile 1, bis alle vorherigen Aufgaben erneut ausgeführt wurden. Das braucht viel Zeit

Im Idealfall möchte ich die Ausführung einer fehlgeschlagenen Aufgabe fortsetzen, indem ich Inventar und alle durch vorherige Aufgaben gesammelten Fakten habe. Ist es überhaupt möglich? Wie kann ich das Schreiben/Debuggen von Playbooks beschleunigen?

53
Sergey Alaev

Schauen Sie sich http://docs.ansible.com/playbooks_startnstep.html an. Wenn Sie Ihr Playbook für eine bestimmte Aufgabe ausführen möchten, können Sie dies mit dem Befehl --start-at-task Möglichkeit:

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

Mit dem obigen Befehl wird Ihr Playbook bei einer Aufgabe mit dem Namen "Pakete installieren" ausgeführt.

Sehen Sie sich alternativ diese vorherige Antwort an Wie führe ich nur eine Aufgabe in einem anonymen Playbook aus?

Wenn ein Stück scheitert, erhalten Sie normalerweise Folgendes:

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

Verwende das --limit Befehl und es sollte von der fehlgeschlagenen Aufgabe wiederholen.

41
Mxx

Zukünftige Leser:

Das --limit @/home/user/site.retry würde in einem solchen Szenario nicht helfen, die .retry speichert nur den ausgefallenen Host und nicht mehr, führt also nur alle Aufgaben für ausgefallene Hosts aus.

Wenn Sie die neueste Version (Ansible 2.x) verwenden, wird --start-at-task funktioniert nicht für Aufgaben, die in roles definiert sind.

Sie können einen ähnlichen Effekt erzielen, indem Sie einfach --step Flagge, z. B .: ansible-playbook playbook.yml --step. Der Schritt fragt Sie, bevor Sie die einzelnen Aufgaben ausführen, und Sie können (N)o/(y)es/(c)ontinue.

Mit diesem Ansatz führen Sie Aufgaben bei Bedarf selektiv aus und fahren nach der Behebung an dem Punkt fort, an dem sie fehlgeschlagen sind.

23
Segmented

Zukunft Zukünftige Leser:

Ab Ansible 2.4.2.0 --start-at-task funktioniert für Aufgaben, die in von mir erstellten Rollen definiert sind.

Das ansible-Team ist nicht bereit, dieses Problem anzugehen. Sie schlagen vor, dass Sie Ihre Rollen idempotent halten und das gesamte Spiel wiederholen. Ich habe keine Zeit dafür. In meinen Rollen verwende ich nicht so viele Fakten wie @JeremyWhiting, also kann ich diese --start-at-task Feature.

Da dies jedoch eine manuelle Aufgabe ist, habe ich stattdessen einige ansible rpm geschrieben und eine "Resume" -Funktion hinzugefügt, die die folgenden grundlegenden Schritte ausführt:

  • Aktiviere das ansible Log über /etc/ansible/ansible.cfg (uncomment log_path)
  • Löschen Sie das Protokoll vor jedem Lauf
  • Nach einem Fehler durchsucht die Funktion "Resume" dieses Protokoll nach der letzten "TASK" -Zeile und verwendet sed, um die Inhalte von "[]" abzurufen.
  • Dann ruft es einfach das zuletzt ausgeführte Spiel mit --start-at-task = "$ start_at_task" auf.
  • Stellen Sie sicher, dass Sie "any_errors_fatal: true" in Ihren Rollen haben, um das Abspielen bei der fehlgeschlagenen Aufgabe zu stoppen, von der Sie fortfahren möchten

Das ansible-Team ist nicht bereit, dieses grundlegende (und sehr nützliche) Feature zu erstellen. Daher besteht die einzige Möglichkeit darin, es über einige Bash-Skripte zusammen zu hacken.

1
Trent