Wie kann ich auf einem Host gleichzeitig ansible laufen und bei einem Fehler abbrechen?

15

Ich habe ein Ansible-Playbook, in dem ich eine Reihe flockiger Geräte nacheinander aktualisieren möchte. Ich kann es verwenden serial:1, aber ich möchte das Playbook ganz anhalten, wenn ich einen Fehler erhalte, damit ich es reparieren kann, bevor ich fortfahre, anstatt Fehler zu akkumulieren.

Ich möchte auch das Playbook auf demselben Host neu starten, auf dem ich angehalten habe. Derzeit wird Ansible v2.0 verwendet, es kann jedoch auch zu einer neueren Version gewechselt werden, wenn diese Art von Funktion nur in neueren Versionen verfügbar ist.

Peter Turner
quelle

Antworten:

15

Ihr Playbook stoppt, wenn ein Fehler auftritt und Sie serial: 1gemäß der Dokumentation verwenden .

Standardmäßig führt Ansible weiterhin Aktionen aus, solange Hosts in der Gruppe noch nicht ausgefallen sind.

Das heißt, es scheint in der Community einige Verwirrung über das Standardverhalten zu geben, und es scheint sich irgendwo zwischen 1.8 und 2.1 geändert zu haben - oder fehlerhaft gewesen zu sein.

Wenn serial: 1dies nicht ausreicht, verwenden Sie diese zusätzliche Einstellung:

max_failure_percentage: 0

In einigen Situationen, wie bei den oben beschriebenen fortlaufenden Aktualisierungen, kann es wünschenswert sein, das Spiel abzubrechen, wenn eine bestimmte Schwelle von Fehlern erreicht wurde. Um dies zu erreichen, können Sie ab Version 1.3 einen maximalen Ausfallprozentsatz festlegen ...

==

Wenn Sie Ihr Playbook erneut versuchen, sollte eine Fehlermeldung wie die folgende angezeigt werden:

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

Verwenden Sie dieses --limitFlag bei Ihrer nächsten Ausführung von ansible-playbookund es wird dort fortgesetzt, wo es fehlgeschlagen ist.

Wiederholungsdateien werden erstellt, sofern Sie dies nicht retry_files_enabled = Falsein Ihrer Konfiguration festgelegt haben.

Alternativ --start-at-taskkann auch funktionieren.

Quellen:

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

Waldjäger
quelle
1
Wenn jemand eine bessere Vorstellung davon hat, was mit der Änderung / dem Fehler in 1.9 und 2.0 passiert ist, lass es mich bitte wissen und ich werde diese Antwort aktualisieren.
Woodland Hunter
Ja, ich weiß, dass Ansible 2.0 weiterhin auf anderen Hosts ausgeführt wird, wenn bei einem der Hosts ein Fehler auftritt. Ich glaube, ich hätte nicht gedacht, dass es ein anderes Verhalten hätte, wenn ich seriell lief: 1. Ist es das was du sagst?
Peter Turner
Das ist richtig, serial: 1 sollte dieses Verhalten haben, und wenn dies nicht der Fall ist (weil ??), fügen Sie auch max_failure_percentage: 0 hinzu. Ich würde auch vorschlagen, Ansible zu aktualisieren, da 2.0 viele Fehler aufwies.
Woodland Hunter
Tatsächlich so viele Fehler, dass Ihnen die .retry-Dateien in 2.0 fehlen! github.com/ansible/ansible/issues/13944
Woodland Hunter
Heh, also bin ich nicht der Einzige, der die Quelle ständig aktualisiert. Das ist gut zu wissen.
Peter Turner