Извлечение вложенного объекта в Jinja2 - PullRequest
0 голосов
/ 19 мая 2019

Мне нужно извлечь IPv4-адреса для определенного интерфейса из hostvars в шаблоне Ansible Jinja2 без использования циклов.

Попытка извлечь объект ansible_eth1 из hostvars успешна, и Ansible предоставляет мне всю информацию об интерфейсе eth1:

- debug:
    msg: "{{ groups['my_hosts'] | map('extract', hostvars, 'ansible_eth1') | join(', ') }}"
TASK [my_task : debug] *****************************************************************************************************************************************************************************************************
ok: [server1] => {
    "msg": [
        {
            "active": true, 
            "device": "eth1", 
            ...
            "ipv4": {
                "address": "192.168.56.15", 
                "broadcast": "192.168.56.255", 
                "netmask": "255.255.255.0", 
                "network": "192.168.56.0"
            }, 
            ...

Но если я попытаюсь извлечь вложенный объект -'ipv4.address' - возвращает пустой список:

- debug:
    msg: "{{ groups['my_hosts'] | map('extract', hostvars, 'ansible_eth1.ipv4.address') | join(', ') }}"
TASK [my_task : debug] *****************************************************************************************************************************************************************************************************
ok: [server1] => {
    "msg": ", "
}
ok: [server2] => {
    "msg": ", "
}

Возможно ли это?

1 Ответ

0 голосов
/ 19 мая 2019

Поведение, за которым вы следите, определяется последней строкой в ​​секции extract , где написано «Третий аргумент фильтра также может быть списком для рекурсивного поиска внутри контейнера. «

Таким образом, в вашем случае:

msg: "{{ groups['my_hosts']
       | map('extract', hostvars, ['ansible_eth1', 'ipv4', 'address'])
       | join(', ') }}"
...