2017-06-27 1 views
1

fehlschlägt Ich verwende einige SQL-Skripte mit sqlplus vorhanden. Bevor ich renne bekomme ich alle sql Dateien aus diesem Verzeichnis und speichere es in sql_out wie unten gezeigt.Ansible - Aufgabe überspringen, wenn mindestens ein Element in der Schleife

Das Problem ist, wenn eines der SQL-Skript fehlschlägt, der Rest der SQL-Skripte noch ausgeführt wird. Ich möchte die Aufgabe vollständig überspringen, wenn eines der Skripts fehlschlägt. Gibt es eine Möglichkeit zu überspringen? Ich denke, wir können with_items verwenden, aber nicht sicher, wie zu implementieren. Irgendeine Hilfe?

- name: "Get sql files from directory" 
    shell: ls {{ directory }}/{{ scripts_path }}/*.sql 
    register: sql_out 
    tags: 
    - sql 

    - name: "Execute each SQL Scripts" 
    script: sqlplus.sh {{ db_username }} {{ db_password }} {{ 
    connection_string }} {{ schema }} {{ item }} 
    delegate_to: localhost 

    with_items: sql_out.stdout_lines 
    tags: 
    - sql 
+0

Bitte beschreiben Sie das genaue Szenario von dem, was Sie erreichen möchten. Nenne Beispiele. Beschreiben Sie, auf welche Weise die Skripts fehlschlagen. Und pars 'ls' nicht! – techraf

+0

Außerdem ist die "Tags" entscheidend für die Frage? Erfordert der Parameter 'script' den von Ihnen eingeschlossenen Zeilenumbruch? Soll die erste Aufgabe auf Remote-Ziel (en) und die zweite lokal ausgeführt werden? Weil das im Code steht. Was meinst du mit "* nicht sicher, wie man * implementiert"? Haben Sie versucht, den von Ihnen geposteten Code auszuführen, oder haben Sie entschieden, dass es sich nicht lohnt, es zu versuchen, und besser jemanden auf StackOverflow dazu bringen, es für Sie zu tun? – techraf

Antwort

3

AFAIK dies ist ab der aktuellen Ansible Version 2.3 nicht möglich.

Task Executor arbeitet in such way, dass es jede Schleifeniteration zuerst ausführt und erst dann Aufgaben-/Element-Ergebnisse analysiert.

Sie sollten Ihr Shell-Skript so umgestalten, dass es Skriptlisten als Parameter empfangen und sie im Skript, nicht mit Ansible, durchlaufen kann. Dies wird Ihnen auch einen deutlichen Geschwindigkeitsschub geben.

+0

Ich bitte um Unterschiede, es ist perfekt machbar. – techraf

+0

Danke für Ihre Lösung. Ich habe mein Shell-Skript geändert und die Iteration in Ansible entfernt – vkrams

3

Da Sie keine Angaben dazu gemacht haben, was Sie unter "überspringen Aufgabe" verstehen, poste ich eigentlich nur eine Konzeptantwort. In der aktuellen Form werden die Skripte sequenziell ausgeführt und wenn eine fehlschlägt, wird die gesamte Aufgabe fehlschlagen. Wenn Sie möchten, dass andere Skripts übersprungen werden, müssen Sie zusätzliche Prüfungen hinzufügen.

Extrahieren Sie das Skript laufende Aufgabe in einer separaten Datei und es in einem with_fileglob -loop:

- include: runscript.yml 
    with_fileglob: "{{ directory }}/{{ scripts_path }}/*.sql" 

mit runscript.yml:

- script: sqlplus.sh {{ db_username }} {{ db_password }} {{ connection_string }} {{ schema }} {{ item }} 
+0

Ich stimme zu, dass es machbar ist, aber stimme nicht zu, dass es perfekt ist. Wir wissen beide, dass das Schleifen-Include für die Schleifenaufgabe völlig unterschiedlich ist. Auch dies fügt eine weitere Ebene von Komplexität und Langsamkeit hinzu. –

0

Sie sollten Strategie Parameter in ansible hinzuzufügen. Wenn die Aufgabe fehlschlägt, wird die Ausführung des Playbooks gestoppt. 'strategie: debug'

- name: Install & Configure Test server gather_facts: True strategy: debug sudo: yes hosts: test-client vars: test_server_ip: xxx.xxx.xx.xx roles: - { role: tools, tags: ['tools']} - { role: test-client, tags: ['test-client']} Details finden Sie here. Ich benutze ansible 2.2.1.0

Verwandte Themen