Цикл над массивом переменных Ansible в шаблоне Jinja2

12

когда Ansible собирает факты о хостах, он, например, получает все монтирования хоста:

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

И так далее. Итак, что я хочу сделать: в шаблоне я хочу перебрать все объекты в массиве и вывести значения каждого ключа «монтирования».

Я пытаюсь это так:

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

Но это не работает. Я пробовал некоторые другие вещи, такие как iteritems (), но я не могу заставить его работать. Насколько я знаю, выход Ansible в json, если это кому-нибудь поможет. Кто-нибудь знает решение или это больше вопрос для stackoverflow?

Спасибо за любые ответы.

ThatGuyOnTheNet
источник

Ответы:

17

У вас есть простая синтаксическая ошибка; Вы должны использовать скобки вместо скобок.

В настоящее время у вас есть:

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

Это должны быть скобки, а не скобки, то есть {%и %}.

Кроме того, имя переменной, которое вы выбрали, for- mountsэто то, что вы должны использовать внутри цикла для получения каждого объекта.

Наконец, скобки вокруг переменной в цикле for не нужны.

Исправление этих ошибок приводит к этому, который должен работать нормально:

{% for mounts in ansible_mounts %}
Mountpoint: {{ mounts.mount }}
{% endfor %}
Майкл Хэмптон
источник
черт побери, читайте комментарий с фигурными скобками ... трудно заметить, если вы сначала случайно скопировали неправильный блок. :(
Маркус