2015-12-17 5 views
8

Ich arbeite an der Automatisierung einer Aufgabe, die die neueste Version der Software an eine Datei anhängen muss. Ich möchte es nicht mehrmals für die gleiche Version machen.Auswertung des Rückgabecodes in ansible Bedingung

Es befindet sich auf der folgenden Beispieldatei aussieht:

var software releases = new Array(
    "4.3.0", 
    "4.4.0", 
    "4.5.0", 
    "4.7.0", 
    "4.8.0", 
    "4.11.0", 
    "4.12.1", 
    "4.14.0", 
    "4.15.0", 
    "4.16.0", 
); 

die Standardwerte main.yml in so etwas wie

VERSION: 4.16.2 

Code

- name: register version check 
    shell: cat /root/versions.js | grep -q {{VERSION}} 
    register: current_version 

- debug: msg="The registered variable output is {{ current_version.rc }}" 

- name: append to versions.js 
    lineinfile: 
    dest: /root/versions.js 
    regexp: '^\);' 
    insertbefore: '^#\);' 
    line: " \"{{VERSION}}\",\n);" 
    owner: root 
    state: present 
    when: current_version.rc == 1 

Problem passieren würde: die Debug-Nachricht ist Bewertung current_version.rc und zeigt mir boolesche Werte auf der Basis der Grep-Befehle Ausgabe, aber ich kann nicht re Verwenden Sie dies in der when Bedingung, um festzustellen, ob die Aufgabe ausgeführt werden soll.

Edit: die Ausgabe:

PLAY [localhost] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [localhost] 

TASK: [test | register version check] ***************************************** 
failed: [localhost] => {"changed": true, "cmd": "cat /root/versions.js | grep -q 3.19.2", "delta": "0:00:00.003570", "end": "2015-12-17 00:24:49.729078", "rc": 1, "start": "2015-12-17 00:24:49.725508", "warnings": []} 

FATAL: all hosts have already failed -- aborting 

PLAY RECAP ******************************************************************** 
      to retry, use: --limit @/root/site.retry 

localhost     : ok=1 changed=0 unreachable=0 failed=1 
+0

Können Sie den Ausgang des Spiels veröffentlichen? – ydaetskcoR

+0

Sie gelangen nicht zur when-Anweisung, weil der Rückkehrcode 1 ist. Fügen Sie 'ignore_errors: True' hinzu. – nikobelia

+0

Nikobelia - das hat mein Problem gelöst! Fühlen Sie sich frei, dies zu beantworten, damit ich es markieren kann, wenn Sie möchten. Vielen Dank. – Bryan

Antwort

20

Wie nikobelia wies in den Kommentaren aus, grep returns an exit code of 1 when it doesn't match any lines. Ansible interpretiert dies (eigentlich jeden anderen Statuscode als 0 von einer Shell-/Befehls-Task) als einen Fehler und schlägt daher sofort fehl.

Sie können Ansible den Antwortcode von der Shell-/Befehlsaufgabe ignorieren, indem Sie ignore_errors verwenden. Obwohl mit grep wird diese tatsächliche Fehler (durch einen Return-Code von 2 angegeben) ignorieren so stattdessen möchten Sie vielleicht failed_when wie folgt verwenden:

- name: register version check 
    shell: cat /root/versions.js | grep -q {{VERSION}} 
    register: current_version 
    failed_when: current_version.rc == 2 
+0

Ja, zur Vervollständigung können Sie auch verwenden: 'failed_when: (result.rc nicht in [0, 1])' – Boop