Loop over Ansible variable array in Jinja2 template

60,407

You have a simple syntax error; you should be using brace brackets instead of parentheses.

You currently have:

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

These should be braces, not parentheses, that is, {% and %}.

Further, the variable name you selected in for is mounts, so that is what you should be actually using inside the loop to get each object.

Finally, the braces around the variable in the for loop aren't necessary.

Correcting these errors results in this, which should work fine:

{% for mounts in ansible_mounts %}
Mountpoint: {{ mounts.mount }}
{% endfor %}
Share:
60,407

Related videos on Youtube

ThatGuyOnTheNet
Author by

ThatGuyOnTheNet

Updated on September 18, 2022

Comments

  • ThatGuyOnTheNet
    ThatGuyOnTheNet over 1 year

    when Ansible gathers facts about hosts, it for example gets all the mounts of the 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"
                }, 
    

    And so on. So what I want to do is: In a template I want to loop over all the objects in the array and output the values of each "mount" key.

    I try it like this:

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

    But it does not work. I tried around with some other stuff like iteritems() but I cannot get it to work. As far as I know the output of Ansible is in json, if that helps anybody. Does somebody know the solution or is this more of a question for stackoverflow?

    Thanks for any answers.