Loop sobre matriz variável Ansible no modelo Jinja2

12

quando o Ansible reúne fatos sobre hosts, por exemplo, obtém todas as montagens do host:

 "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"
            }, 

E assim por diante. Então, o que eu quero fazer é: Em um modelo, quero fazer um loop sobre todos os objetos na matriz e gerar os valores de cada tecla "mount".

Eu tento assim:

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

Mas não funciona. Eu tentei usar outras coisas como iteritems (), mas não consigo fazê-lo funcionar. Até onde eu sei, a saída do Ansible está em json, se isso ajuda alguém. Alguém conhece a solução ou isso é mais uma pergunta para o stackoverflow?

Obrigado por todas as respostas.

ThatGuyOnTheNet
fonte

Respostas:

17

Você tem um erro de sintaxe simples; você deve usar colchetes em vez de parênteses.

Você tem atualmente:

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

Devem ser chaves, não parênteses, ou seja, {%e %}.

Além disso, o nome da variável que você selecionou foré mounts, então é isso que você deve realmente usar dentro do loop para obter cada objeto.

Finalmente, as chaves ao redor da variável no loop for não são necessárias.

A correção desses erros resulta nisso, o que deve funcionar bem:

{% for mounts in ansible_mounts %}
Mountpoint: {{ mounts.mount }}
{% endfor %}
Michael Hampton
fonte
maldita leitura sobre o comentário com o aparelho ... difícil de detectar se você acidentalmente copiar o bloco errado primeiro. :(
Markus