2016-07-19 6 views
0

Ich versuche, eine AWS-Implementierungsumgebung in Ansible hochzufahren, und ich möchte es so einrichten, dass, wenn etwas auf dem Weg fehlschlägt, Ansible alles auf AWS zerreißt war bis jetzt gesponnen. Ich kann nicht herausfinden, wie ansible bekommen einen Fehler in der RolleAnsible - Bei Fehler, Rolle beenden und Bereinigung ausführen

Zum Beispiel zu werfen:

<main.yml> 
- hosts: localhost 
    connection: local 
    roles: 
    - make_ec2_role 
    - make_rds_role 
    - make_s3_role 

    2. Then I want it to run some code based on that error here. 

<make_rds_role> 
    - name: "Make it" 
    - rds: 
     params: etc <-- 1. Let's say it fails in the middle here 

Ich habe versucht:

- name: this command prints FAILED when it fails 
    command: /usr/bin/example-command -x -y -z 
    register: command_result 
    failed_when: "'FAILED' in command_result.stderr" 

sowie andere Dinge innerhalb die Dokumentation, aber was ich wirklich will, ist nur ein Weg, etwas wie die "Block" und "Rettungs" -Befehle zu verwenden, aber soweit ich sagen kann, das funktioniert nur innerhalb des gleichen Buches und auf Spielen, nicht Rollen. Hat jemand einen guten Weg, dies zu tun?

Antwort

0

Wrap Aufgaben in Ihren Rollen in Block/Rettung Sache.
Stellen Sie sicher, dass der Rettungsblock mindestens eine Aufgabe hat - auf diese Weise wird Ansible den Host nicht als ausgefallen markieren.
So:

- block: 
    - name: task 1 

    ... # something bad may happen here 

    - name: task N 

    rescue: 
    - assert: # we need a dummy task here to prevent our host from being failed 
     that: ansible_failed_task is defined 

Neuere Versionen von ansible registeransible_failed_task und ansible_failed_result wenn Rettungs Block getroffen.
So können Sie einige post_tasks in Ihrem main.yml Textbuch wie folgt tun:

post_tasks: 
    - debug: 
     msg: "Failed task: {{ ansible_failed_task }}, failed result: {{ ansible_failed_result }}" 
     when: ansible_failed_task is defined 

Aber gewarnt werden, dass dieser Trick von der Ausführung keine andere Rollen verhindern.
Also in Ihrem Beispiel, wenn make_rds_role fehlschlägt ansible wird gelten make_s3_role und führen Sie Ihre post_tasks danach.
Wenn Sie es verhindern müssen, fügen Sie eine Überprüfung für ansible_failed_task Tatsache am Anfang jeder Rolle oder etwas hinzu.

+0

Ich habe es versucht und es funktioniert. Ich wusste nicht, dass Ansible eine definierte Fehlerstatusvariable hatte. Vielen Dank! – ExaExcellion

Verwandte Themen