2016-08-09 1 views
0

Ich versuche, ein Ansible-Skript zu schreiben, das eine Shell-Pipeline ausführt, und bestimmt, ob die Ausführung des Playbooks basierend auf der Ausgabe dieser Pipeline beendet wird.Überprüfen der Ausgabe eines Shell-Befehls in ansible

Hier ist die problematische Code:

- name: Check if the number of HITACHI devices is equal to 1 
    shell: lsscsi | grep HITACHI | awk '{print $6}' | wc -l 
    register: numOfDevices 
    when: numOfDevices|int == 1 

Hier wird der Fehler:

{ 
    "failed":true, 
    "msg":"The conditional check 'numOfDevices|int == 1' failed. 
The error was: error while evaluating conditional (numOfDevices|int == 1): 'numOfDevices' is undefined\n\nThe error appears to have been in '/etc/ansible/config/test.yml': line 14, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Check if the number of HITACHI devices is equal to 1\n ^here\n" 
} 

Kann mir jemand sagt, was das Problem sein könnte?

+1

'grep | awk | wc'? Du erkennst, dass 'awk' die Aufgabe aller drei Befehle ausführen könnte? –

+0

BTW, was ist dein eigentliches Ziel hier? Möchten Sie die Ausführung des Playbooks stoppen, wenn nicht genau ein Hitachi-Gerät vorhanden ist? Führen Sie einen anderen Befehl aus, wenn genau ein Hitachi-Gerät vorhanden ist (oder nicht)? Etwas anderes? Die 'when'-Klausel macht keinen Sinn, wo Sie sie haben; Die Frage ist, wo es sein sollte. –

+0

Ich möchte das Playbook anhalten, wenn es nicht genau ein Hitachi-Gerät gibt. – Omri

Antwort

2

Betrachten Sie den Vergleich in der Shell-Befehl tun:

- name: Check if the number of HITACHI devices is equal to 1 
    shell: test "$(lsscsi | awk '/HITACHI/ { count++ } END { print count }')" -eq 1 

Sie brauchen nicht register überhaupt hier zu verwenden, da die Standard-failedWhen ist, wenn der Exit-Status eines Befehls von null verschieden ist.


Wenn Sie haben wollen register verwenden, aber:

- name: Check if the number of HITACHI devices is equal to 1 
    shell: lsscsi | awk '/HITACHI/ { count++ } END { print count }' 
    register: countHitachiDevices 
    failed_when: int(countHitachiDevices.stdout) != 1 

Beachten Sie die Verwendung von failed_when statt when: Eine when Klausel legt fest, ob ein Befehl überhaupt werden wird ausgeführt, während eine failed_when-Klausel bestimmt, ob festgestellt wird, dass der Befehl fehlgeschlagen ist.

+0

Kannst du erklären, wofür '-eq 1' steht? – Omri

+0

'[' in der Shell ist der Befehl auch 'test' genannt; http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html dokumentiert die POSIX-Baseline-Funktionalität, die für alle Implementierungen garantiert ist. '-eq' ist ein numerischer Vergleich. –

+0

Danke! Die erste Lösung hat super funktioniert. Wenn ich versuchte, die Sekunden-Lösung zu starten, bekomme ich: 'fatal: FAILED! => {"failed": true, "msg": "Die bedingte Prüfung 'int (countHitachiDevices.stdout)! = 1' ist fehlgeschlagen. Der Fehler war: Fehler bei der Auswertung der Bedingung (int (countHitachiDevices.stdout)! = 1): 'int' ist undefiniert "}'. Weißt du, warum? – Omri

Verwandte Themen