2015-08-07 13 views
13

Dostałam zadanie zweryfikować niektóre wpisy routingu dla wszystkich serwerów Linux i tu jest jak to zrobiłem przy użyciu playbook ansiblansibl wynik rejestr wielu poleceń

--- 
    - hosts: Linux 
    serial: 1 

    tasks: 
     - name: Check first 
     command: /sbin/ip route list xxx.xxx.xxx.xxx/24 
     register: result 
     changed_when: false 

     - debug: msg="{{result.stdout}}" 

     - name: Check second 
     command: /sbin/ip route list xxx.xxx.xxx.xxx/24 
     register: result 
     changed_when: false 

     - debug: msg="{{result.stdout}}" 

Widać muszę powtórzyć to samo zadanie dla każdego wpisu routingu i uważam, że powinienem móc tego uniknąć. Próbowałem użyć with_items pętlę ale mam następujący komunikat o błędzie

One or more undefined variables: 'dict object' has no attribute 'stdout' 

czy istnieje sposób, aby zarejestrować zmienną dla każdego polecenia i pętli nad nimi, jeden po drugim?

+0

Na to należy odpowiedzieć w odpowiednich podręcznikach/samouczkach ... – vonbrand

Odpowiedz

23

Zaczynając od Ansaly 1.6.1, wyniki zarejestrowane z wieloma pozycjami są przechowywane w tablicy result.results. Więc możesz użyć result.results[0].stdout i tak dalej.

Testowanie PlayBook:

--- 
- hosts: localhost 
    gather_facts: no 
    tasks: 
    - command: "echo {{item}}" 
     register: result 
     with_items: [1, 2] 
    - debug: 
     var: result 

Wynik:

$ ansible-playbook -i localhost, test.yml 

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

TASK: [command echo {{item}}] ************************************************* 
changed: [localhost] => (item=1) 
changed: [localhost] => (item=2) 

TASK: [debug ] **************************************************************** 
ok: [localhost] => { 
    "var": { 
     "result": { 
      "changed": true, 
      "msg": "All items completed", 
      "results": [ 
       { 
        "changed": true, 
        "cmd": [ 
         "echo", 
         "1" 
        ], 
        "delta": "0:00:00.002502", 
        "end": "2015-08-07 16:44:08.901313", 
        "invocation": { 
         "module_args": "echo 1", 
         "module_name": "command" 
        }, 
        "item": 1, 
        "rc": 0, 
        "start": "2015-08-07 16:44:08.898811", 
        "stderr": "", 
        "stdout": "1", 
        "stdout_lines": [ 
         "1" 
        ], 
        "warnings": [] 
       }, 
       { 
        "changed": true, 
        "cmd": [ 
         "echo", 
         "2" 
        ], 
        "delta": "0:00:00.002516", 
        "end": "2015-08-07 16:44:09.038458", 
        "invocation": { 
         "module_args": "echo 2", 
         "module_name": "command" 
        }, 
        "item": 2, 
        "rc": 0, 
        "start": "2015-08-07 16:44:09.035942", 
        "stderr": "", 
        "stdout": "2", 
        "stdout_lines": [ 
         "2" 
        ], 
        "warnings": [] 
       } 
      ] 
     } 
    } 
} 

PLAY RECAP ******************************************************************** 
localhost     : ok=2 changed=1 unreachable=0 failed=0 
-2

Jeśli to, co potrzebne jest, aby zarejestrować wyjście dwóch komend oddzielnie używać różnych nazw zmiennych.

--- 
- hosts: Linux 
    serial: 1 
    tasks: 
    - name: Check first 
    command: /sbin/ip route list xxx.xxx.xxx.xxx/24 
    register: result0 
    changed_when: false 

    - debug: msg="{{result0.stdout}}" 

    - name: Check second 
    command: /sbin/ip route list xxx.xxx.xxx.xxx/24 
    register: result1 
    changed_when: false 

    - debug: msg="{{result1.stdout}}" 
2

Nieco inna sytuacja, której znalezienie zajęło trochę czasu. Jeśli chcesz użyć wyników wielu elementów, ale dla changed_when, wtedy zmienna rejestrowa nie będzie miała var.results! Zamiast tego, changed_when, jest obliczany dla każdego elementu, i możesz po prostu bezpośrednio użyć rejestru var.

prosty przykład, który spowoduje zmiany: fałsz:

- action: command echo {{item}} 
    register: out 
    changed_when: "'z' in out.stdout" 
    with_items: 
    - hello 
    - foo 
    - bye 

Inny przykład:

- name: Create fulltext index for faster text searches. 
    mysql_db: name={{SO_database}} state=import target=/tmp/fulltext-{{item.tableName}}-{{item.columnName}}.sql 
    with_items: 
    - {tableName: Posts, columnName: Title} 
    - {tableName: Posts, columnName: Body} 
    - {tableName: Posts, columnName: Tags} 
    - {tableName: Comments, columnName: Text} 
    register: createfulltextcmd 
    changed_when: createindexcmd.msg.find('already exists') == -1 

Wreszcie, jeśli chcesz pętli rezultatów w innych kontekstach, to nie wydaje się nieco trudny do programowego dostępu do indeksu, ponieważ nie jest narażony. Znalazłem ten przykład, który może być obiecujący:

- name: add hosts to known_hosts 
shell: 'ssh-keyscan -H {{item.host}}>> /home/testuser/known_hosts' 
with_items: 
    - { index: 0, host: testhost1.test.dom } 
    - { index: 1, host: testhost2.test.dom } 
    - { index: 2, host: 192.168.202.100 } 
when: ssh_known_hosts.results[{{item.index}}].rc == 1