Создайте список устройств и интерфейсов
- set_fact:
dev_ifc: "{{ dev_ifc|d([]) + [{'dev': item.1, 'ifc': item.0.key}] }}"
with_subelements:
- "{{device_vlans|dict2items}}"
- значение.интерфейсы
дает
dev_ifc:
- {dev: GigabitEthernet1/1, ifc: '1'}
- {dev: GigabitEthernet1/2, ifc: '1'}
- {dev: GigabitEthernet1/3, ifc: '1'}
- {dev: GigabitEthernet1/2, ifc: '20'}
- {dev: GigabitEthernet1/3, ifc: '30'}
Затем сгруппируйте список по устройствам и создайте словарь
- set_fact:
device_vlans: "{{ dict(key|zip(val)) }}"
вары:
arr: "{{ dev_ifc|groupby('dev') }}"
ключ: "{{ обр|карта('первый')|список }}"
val: "{{ обр|карта('последняя')|
карта ('json_query', '[].ifc') |
map('community.general.dict_kv', 'интерфейсы')|
список }}"
дает
device_vlans:
Гигабитный Ethernet1/1:
интерфейсы: ['1']
Гигабитный Ethernet1/2:
интерфейсы: ['1', '20']
Гигабитный Ethernet1/3:
интерфейсы: ['1', '30']
Можно избежать итерации в задаче. Вместо этого поместите итерацию в Jinja2. Например, поместите объявления ниже как соответствующий
dev_ifc_str: |-
{% для ifc в device_vlans.keys() %}
{% для разработчиков в device_vlans[ifc]['interfaces'] %}
- {dev: {{dev}}, ifc: {{ifc}}}
{% конец для %}
{% конец для %}
dev_ifc: "{{ dev_ifc_str|from_yaml }}"
device_vlans2: "{{ dict(_key|zip(_val)) }}"
_arr: "{{ dev_ifc|groupby('dev') }}"
_key: "{{ _arr|карта('первый')|список }}"
_val: "{{ _arr|карта('последняя')|
карта ('json_query', '[].ifc') |
map('community.general.dict_kv', 'интерфейсы')|
список }}"