2016-06-20 11 views
3

Auf der Suche nach Hilfe mit einem Problem, mit dem ich seit ein paar Stunden gekämpft habe. Ich möchte über eine Liste iterieren, einen Befehl ausführen, die Ausgabe für jeden Befehl registrieren und dann mit Debug über jedes eindeutige Register {{someregister}} iterieren. StdoutIteration mit With_items und Register

Zum Beispiel spuckt der folgende Code "msg „:‚1‘ und ‚msg‘:‚2‘

--- 

- hosts: localhost 
    gather_facts: false 

    vars: 
    numbers: 
     - name: "first" 
     int: "1" 
     - name: "second" 
     int: "2" 

    tasks: 

    - name: Register output 
     command: "/bin/echo {{ item.int }}" 
     register: result 
     with_items: "{{ numbers }}" 

    - debug: msg={{ item.stdout }} 
     with_items: "{{ result.results }}" 

Wenn ich jedoch versuchen, die Ausgabe eines Befehls in einer Registervariablen erfassen, die with_list mit Namen, ich habe Probleme beim Zugriff auf die Liste oder die Elemente darin. Zum Beispiel, um den Code leicht zu verändern:

--- 

- hosts: localhost 
    gather_facts: false 

    vars: 
    numbers: 
     - name: "first" 
     int: "1" 
     - name: "second" 
     int: "2" 

    tasks: 

    - name: Register output 
     command: "/bin/echo {{ item.int }}" 
     register: "{{ item.name }}" 
     with_items: "{{ numbers }}" 

    - debug: var={{ item.name.stdout }} 
     with_items: "{{ numbers }}" 

mir gibt:

TASK [debug] 

> ******************************************************************* fatal: [localhost]: FAILED! => {"failed": true, "msg": "'unicode 
> object' has no attribute 'stdout'"} 

Ist es nicht möglich, dynamisch die Ausgabe eines Befehls der Registernamen, die dann später im Spiel aufgerufen werden ? Ich möchte, dass auf jede Iteration des Befehls und seines nachfolgenden Namens eindeutig zugegriffen wird, z. B. in Anbetracht des letzten Beispiels, das ich erwarten würde, dass dort Variablen registriert sind, die "erste" und "zweite" genannt werden, aber nicht.

Die with_items aus der Debug-Zeilengruppe entfernen und nur die Variable oder Nachricht explizit definieren, die first.stdout verwendet, gibt "undefined" zurück.

Ansible-Version ist 2.0.2.0 auf Centos 7_2.

Vielen Dank im Voraus.

Antwort

1

Ich bin nicht sicher, ob ich die Frage richtig verstanden hat, aber vielleicht kann dies helfen:

- debug: msg="{{ item.stdout }}" 
     with_items: echo_out.results 

Bitte beachten Sie, dass ansible jeden Artikel gedruckt wird und die msg beide - so müssen Sie schauen sorgfältig für eine Linie, die wie "msg": "2" aussieht.

+0

Dank Amit, die dazu beigetragen haben, und ich habe die Frage in der Hoffnung, dass neu geschrieben es ist klarer zu verstehen. – Rowley

7

OK, also habe ich eine post on stackoverflow gefunden, die mir geholfen hat, besser zu verstehen, was hier vor sich geht und wie man auf die Elemente in result.results zugreift.

Der resultierende Code, den ich mit am Ende war:

--- 

- hosts: localhost 
    gather_facts: false 

    vars: 
    numbers: 
     - name: "first" 
     int: "1" 
     - name: "second" 
     int: "2" 

    tasks: 

    - name: Register output 
     command: "/bin/echo {{ item.int }}" 
     register: echo_out 
     with_items: "{{ numbers }}" 

    - debug: msg="item.item={{item.item.name}}, item.stdout={{item.stdout}}" 
     with_items: "{{ echo_out.results }}" 

Was mir das gewünschte Ergebnis führte:

"msg": "item.item=first, item.stdout=1" 
"msg": "item.item=second, item.stdout=2" 
+1

Was mich auf die nächste Ausgabe bringt. So vergleichen Sie die Standardausgabe von jeder Befehlsiteration, sodass Sie sie mit einem anderen Befehl überprüfen und korrigieren können, wenn der Rückgabewert nicht dem entspricht, was erwartet wurde ... – Rowley