it-swarm.com.de

Ansible Ignoriere Fehler in Tasks und scheitere am Ende des Playbooks, wenn Tasks Fehler aufwiesen

Ich lerne Ansible. Ich habe ein Wiedergabebuch, um Ressourcen zu bereinigen, und ich möchte, dass das Wiedergabebuch jeden Fehler ignoriert und bis zum Ende weitermacht und dann am Ende fehlschlägt, wenn Fehler aufgetreten sind.

Ich kann Fehler mit ignorieren

  ignore_errors: yes

Wenn es eine Aufgabe wäre, könnte ich so etwas tun (von ansible error catching)

- name: this command prints FAILED when it fails
  command: /usr/bin/example-command -x -y -z
  register: command_result
  ignore_errors: True

- name: fail the play if the previous command did not succeed
  fail: msg="the command failed"
  when: "'FAILED' in command_result.stderr"

Wie scheitere ich am Ende? Ich habe mehrere Aufgaben. Wie würde mein "Wann" -Zustand lauten?

36
Illusionist

Verwenden Sie das Fail Modul.

  1. Verwenden Sie ignore_errors für jede Aufgabe, die Sie im Fehlerfall ignorieren müssen.
  2. Setzen Sie ein Flag (z. B. result = false), wenn bei der Ausführung einer Aufgabe ein Fehler auftritt
  3. Überprüfen Sie am Ende des Playbooks, ob das Flag gesetzt ist, und schlagen Sie abhängig davon die Ausführung fehl
- fail: msg="The execution has failed because of errors."
  when: flag == "failed"

Aktualisieren:

Verwenden Sie register, um das Ergebnis einer Aufgabe zu speichern, wie Sie es in Ihrem Beispiel gezeigt haben. Dann benutze eine Aufgabe wie diese:

- name: Set flag
  set_fact: flag = failed
  when: "'FAILED' in command_result.stderr"
25
clever_bassi

Sie können alle Aufgaben, die fehlschlagen können, in einen Block einschließen und ignore_errors: yes Für diesen Block verwenden.

tasks:
  - name: ls
    command: ls -la
  - name: pwd
    command: pwd

  - block:
    - name: ls non-existing txt file
      command: ls -la no_file.txt
    - name: ls non-existing pic
      command: ls -la no_pic.jpg
    ignore_errors: yes 

Lesen Sie mehr über die Fehlerbehandlung in Blöcken hier .

14
Olga

Fail-Modul funktioniert super! Vielen Dank.

Ich musste mein Faktum definieren, bevor ich es überprüfte, sonst würde ich einen undefinierten Variablenfehler erhalten.

Und ich hatte Probleme, wenn ich die Tatsache mit Anführungszeichen und ohne Leerzeichen festlegte.

Das hat funktioniert:

set_fact: flag="failed"

Dies warf Fehler:

set_fact: flag = failed 
1
dank