2014-07-07 20 views
5

Mam definicję Vars takiego:ansibl with_subelements Wartość domyślna

sites: 
- site: mysite1.com 
    exec_init: 
    - "command1 to exec" 
    - "command2 to exec" 
- site: mysite2.com 

to muszę grać z następującym zadaniem

- name: Execute init scripts for all sites 
    shell: "{{item.1}}" 
    with_subelements: 
    - sites 
    - exec_init 
    when: item.0.exec_init is defined 

Chodzi o to, że będę miał wiele definicji „Witryna” z dziesiątkami innych właściwości w moich varach, , a następnie chciałbym wykonać wiele poleceń skryptu Shell dla tych witryn z "exec_init" zdefiniowanymi jako

Doing tak to po prostu zawsze pomija wykonywanie zadania, próbowałem tego we wszystkich kombinacjach, jakie mogę sobie wyobrazić, ale nie mogę go uruchomić ...

Czy to właściwy sposób na zrobienie tego? może próbuję osiągnąć coś, co nie ma sensu?

Dzięki za pomoc

Odpowiedz

4

Hm, wygląda jakby niejednorodną strukturę elementów w sites jest coś with_subelements nie lubi. A także, że item nie zawiera podelementu określonego na liście with_subelements. Można zrobić kilka rzeczy:

  1. Upewnij się, że masz listę exec_init, nawet jeśli jest pusty. with_subelements pominie pozycje z pustymi podelementami. Myślę, że jest to najlepsza opcja, choć nieco niewygodna przy pisaniu podręcznika.

  2. Nie używaj with_subelements i partia wykonać samemu (trochę brzydki):

    - name: Execute init scripts for all sites 
        shell: "echo '{{item.exec_init | join(';')}}' | bash" 
        when: item.exec_init is defined 
        with_items: sites 
    
  3. Dostosuj with_subelements tak, że miałoby to rzeczy z brakującej podelementu. Możesz skopiować oryginał (mój jest w /usr/local/lib/python2.7/dist-packages/ansible/runner/lookup_plugins/with_subelements.py) i umieścić go w katalogu lookup_plugins obok książki, pod inną nazwą (na przykład subelements_missingok.py). Następnie zmień linię 59 z:

    raise errors.AnsibleError("could not find '%s' key in iterated item '%s'" % (subelement, item0)) 
    

    do:

    continue 
    

    następnie zadanie może wyglądać następująco:

    - name: Execute init scripts for all sites 
        debug: "msg={{item.1}}" 
        with_subelements_missingok: 
        - sites 
        - exec_init 
    
4

a jeszcze inny sposób, z flagą skip_missing (ansibl 2.0+):

- name: nested loop skip missing elements 
    with_subelements: 
    - sites 
    - exec_init 
    - flags: 
     skip_missing: true 
2

Działa to dla mnie. Używam wersji 2.1.1 Wystarczy dodać trzeci element na liście podelementy jak pokazano

- name: Iterate over something 
    with_subelements: 
    - "{{ unit }}" 
    - config 
    - skip_missing: True 
+0

Oficjalna dokumentacja w poprzednim poprzednim akapicie tej sekcji: http://docs.ansible.com/ansible/playbooks_loops.html#looping-over-subelements –