Исходные данные - это словарь JSON, в котором имена ключей верхнего уровня непредсказуемы. Мне нужно имя этого ключа TL, когда вложенные данные внутри совпадают со строкой, которая у меня есть.
Я пытаюсь сделать это с помощью фильтра json_query внутри Ansible 2.9.
Я пробовал различные запросы JMESPath ипроверил их документацию, но все, что я нашел, похоже, требует заранее знать имена этих ключей.
Вот пример данных, которые выводятся из модуля ansible ios_facts для интерфейсов:
{
"GigabitEthernet0/9": {
"description": "server",
"ipv4": [],
"macaddress": "b8zz.xxxx.7709",
"type": "Gigabit Ethernet"
},
"Vlan13": {
"description": null,
"ipv4": [
{
"address": "10.20.30.19",
"subnet": "24"
}
],
"macaddress": "b8zz.xxx.yy41",
"type": "EtherSVI"
}
}
Вот игровая книга, с которой я работаю:
---
- name: Cisco IOS - Mgmt Int
connection: network_cli
gather_facts: false
hosts: switch01
vars:
netdb: "{{ hostvars[inventory_hostname]['ansible_net_interfaces'] }}"
tasks:
- name: get ios facts
ios_facts:
gather_subset: interfaces
- name: json_query
set_fact:
mgmtinf: "{{ netdb | json_query(query) }}"
vars:
# this gets me true/false
query: "[Vlan13.ipv4[0].address.contains(@, '10.20.30.19')]"
- name: output json_query
debug:
var: mgmtinf
Выше приведен верный / ложный результат, если результат совпадает. Проблема в том, что я вручную определил интерфейс для просмотра «Vlan13». Поэтому мне нужен способ использовать итератор для этого ключа TL, а затем вернуть значение этого итератора в той части цикла, где происходит совпадение.