Boucle sur le tableau de variables Ansible dans le modèle Jinja2

12

quand Ansible rassemble des faits sur les hôtes, il obtient par exemple toutes les montures de l'hôte:

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

Etc. Donc, ce que je veux faire, c'est: Dans un modèle, je veux faire une boucle sur tous les objets du tableau et afficher les valeurs de chaque clé "mount".

J'essaye comme ça:

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

Mais ça ne marche pas. J'ai essayé avec d'autres choses comme iteritems () mais je ne peux pas le faire fonctionner. Pour autant que je sache, la sortie d'Ansible est en json, si cela aide n'importe qui. Est-ce que quelqu'un connaît la solution ou est-ce plus une question de stackoverflow?

Merci pour toutes les réponses.

ThatGuyOnTheNet
la source

Réponses:

17

Vous avez une simple erreur de syntaxe; vous devez utiliser des accolades au lieu de parenthèses.

Vous avez actuellement:

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

Ce doivent être des accolades, pas des parenthèses, c'est-à-dire {%et %}.

De plus, le nom de variable que vous avez sélectionné forest mounts, c'est donc ce que vous devriez réellement utiliser à l'intérieur de la boucle pour obtenir chaque objet.

Enfin, les accolades autour de la variable dans la boucle for ne sont pas nécessaires.

La correction de ces erreurs se traduit par ceci, qui devrait fonctionner correctement:

{% for mounts in ansible_mounts %}
Mountpoint: {{ mounts.mount }}
{% endfor %}
Michael Hampton
la source
putain de relire le commentaire avec les accolades ... difficile à repérer si vous copiez accidentellement le mauvais bloc en premier. :(
Markus