web-dev-qa-db-fra.com

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

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é de "montage".

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.

12
ThatGuyOnTheNet

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 %)

Il doit s'agir d'accolades et non de parenthèses, c'est-à-dire {% et %}.

De plus, le nom de variable que vous avez sélectionné dans for est 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 %}
17
Michael Hampton