Pętla nad tablicą zmiennych Ansible w szablonie Jinja2

12

kiedy Ansible zbiera informacje o hostach, na przykład pobiera wszystkie wierzchowce hosta:

 "ansible_mounts": [
            {
                "block_available": 7800291, 
                "block_size": 4096, 
                "block_total": 8225358, 
                "block_used": 425067, 
                "device": "/dev/mapper/foobar", 
                "fstype": "xfs", 
                "inode_available": 16403366, 
                "inode_total": 16458752, 
                "inode_used": 55386, 
                "mount": "/", 
                "options": "rw,seclabel,relatime,attr2,inode64,noquota", 
                "size_available": 31949991936, 
                "size_total": 33691066368, 
                "uuid": "2ebc82cb-5bc2-4db9-9914-33d65ba350b8"
            }, 
            {
                "block_available": 44648, 
                "block_size": 4096, 
                "block_total": 127145, 
                "block_used": 82497, 
                "device": "/dev/sda1", 
                "fstype": "xfs", 
                "inode_available": 255595, 
                "inode_total": 256000, 
                "inode_used": 405, 
                "mount": "/boot", 
                "options": "rw,seclabel,relatime,attr2,inode64,noquota", 
                "size_available": 182878208, 
                "size_total": 520785920, 
                "uuid": "c5f7eaf2-5b70-4f74-8189-a63bb4bee5f8"
            }, 

I tak dalej. Tak więc chcę: w szablonie chcę zapętlić wszystkie obiekty w tablicy i wypisać wartości każdego klucza „mount”.

Próbuję tak:

    (% for mounts in {{ ansible_mounts }} %)
    Mountpoint: {{ ansible_mounts.mount }}
    (% endfor %)

Ale to nie działa. Próbowałem z innymi rzeczami, takimi jak iteritems (), ale nie mogę tego uruchomić. O ile wiem wyjście Ansible jest w formacie json, jeśli to pomaga komukolwiek. Czy ktoś zna rozwiązanie, czy jest to raczej pytanie dotyczące przepełnienia stosu?

Dziękuję za wszelkie odpowiedzi.

ThatGuyOnTheNet
źródło

Odpowiedzi:

17

Wystąpił prosty błąd składniowy; powinieneś używać nawiasów klamrowych zamiast nawiasów.

Obecnie masz:

(% for mounts in {{ ansible_mounts }} %)
Mountpoint: {{ ansible_mounts.mount }}
(% endfor %)

Powinny to być nawiasy klamrowe, a nie nawiasy, to znaczy {%i %}.

Ponadto, nazwa zmiennej wybranej w forto mounts, więc to, co powinno być w rzeczywistości za pomocą wewnątrz pętli, aby każdy obiekt.

Wreszcie nawiasy klamrowe wokół zmiennej w pętli for nie są konieczne.

Poprawienie tych błędów powoduje, że powinno to działać dobrze:

{% for mounts in ansible_mounts %}
Mountpoint: {{ mounts.mount }}
{% endfor %}
Michael Hampton
źródło
cholera, przeczytaj komentarz z nawiasami klamrowymi ... trudny do zauważenia, jeśli przypadkowo skopiujesz najpierw zły blok. :(
Markus