группы инвентаря ansible с использованием jinja2

devices:
  children:
    abcgroup:
      children:
        xyzgroup:
          children:
            group1:
              hosts:
                device509:
                  ansible_ssh_host: 1.1.1.1
                device510:
                  ansible_ssh_host: 2.2.2.2
            group2:
              hosts:
                devcice609:
                  ansible_ssh_host: 3.3.3.3
                device610:
                  ansible_ssh_host: 4.4.4.4
        defgroup:
          hosts:
            device0508:
                ansible_ssh_host: 30.30.30.30
            device0608:
                ansible_ssh_host: 31.31.31.31

мой шаблон jinja2

peer-keepalive destination {% if 'group1' in group_names %}{{ansible_ssh_host[1]}} source {{ansible_ssh_host}} {% endif %}

peer-keepalive destination {% if 'group2' in group_names %}{{ansible_ssh_host[1]}} source {{ansible_ssh_host}} {% endif %}

желаемый результат или желаемый результат

on device509 i should get below output
peer-keepalive destination 2.2.2.2 source 1.1.1.1

on device510 i should get below output
peer-keepalive destination 1.1.1.1 source 2.2.2.2

on device609 i should get below output
peer-keepalive destination 4.4.4.4 source 3.3.3.3

on device610 i should get below output
peer-keepalive destination 3.3.3.3 source 4.4.4.4

вывод, который я получаю на каждом устройстве, приведен ниже, мой шаблон jinja2 неверен, я получаю точку (.)

on device509 i get below
peer-keepalive destination . source 1.1.1.1 

device510 i get below
peer-keepalive destination . source 2.2.2.2 

on device609 i get below
peer-keepalive destination . source 3.3.3.3 

device610 i get below
peer-keepalive destination . source 4.4.4.4 

как это исправить


person vish    schedule 23.02.2021    source источник
comment
Если вам нужен IP-адрес другого хоста, почему вы запрашиваете второй символ текущего IP-адреса хоста? Вы получаете именно то, о чем просили =› . Ваше требование на самом деле совсем не ясно. Для источника это довольно просто: вы хотите использовать текущий IP-адрес хоста. Но как получить IP-адрес назначения?   -  person Zeitounator    schedule 23.02.2021
comment
@Zeitounator устройство509 и устройство510 представляют собой пару, на устройстве509 IP-адрес назначения должен быть IP-адресом устройства510, а на IP-адресе устройства510 должен быть IP-адрес устройства 509. Требуемый результат отличается от того, что я получаю, похоже, мой шаблон jinja2 неверен, я не уверен, как получить «желаемый результат»   -  person vish    schedule 23.02.2021
comment
Прежде чем вы даже подумаете о шаблоне, у вас есть проблема с дизайном. Как вы решаете, какие устройства находятся в паре? Потому что они в одной группе? Что будет, если вдруг в группе окажется 3 хоста? Знаете ли вы, что, например. device509 принадлежит уже к 5 группам в вашем инвентаре? Как вы будете различать group1 и device? Мои 2 цента: если вы проектируете пары, просто добавьте переменную network_peer: deviceXXX для каждого устройства. Во время работы на любом устройстве вы можете получить доступ к любому значению на узле в словаре hostvars[network_peer].   -  person Zeitounator    schedule 23.02.2021
comment
@Zeitounator спасибо за ваше предложение, я отправил ответ.   -  person vish    schedule 24.02.2021


Ответы (1)


это сработало для меня

peer-keepalive destination {{ hostvars[groups['group1'][1]].ansible_ssh_host }} source {{ hostvars[groups['group1'][0]].ansible_ssh_host }}

peer-keepalive destination {{ hostvars[groups['group1'][0]].ansible_ssh_host }} source {{ hostvars[groups['group1'][1]].ansible_ssh_host }}

то же самое для группы 2

person vish    schedule 24.02.2021