解析嵌套 JSON 字典 Ansible
Parse Nested JSON Dictionary Ansible
我正在尝试使用 jmesquery 在 Ansible 中的给定 JSON 中获取满足特定条件的接口名称。
问题是列表中的项目已命名,它不是包含其中每个项目的所有值的列表,并且不知道如何过滤它。
条件是 vlan == "1" 这个 JSON 应该给出 output 类似 ['GigabitEthernet0/0', 'GigabitEthernet0/1']
在使用 dict2items 之后(正如@mdaniel 所建议的那样),我成功地应用了带条件的过滤器,但我正在努力检索现在位于 key 中的接口名称:
- name: PRINT
debug:
msg: "{{ jsondata.interfaces | dict2items | json_query( query ) }}"
vars:
query: >-
[][value][?vlan=='1']
JSON
interfaces: {
"GigabitEthernet0/0": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
},
"GigabitEthernet0/1": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
}
JSON 申请后 jsondata.interfaces | dict2items
[
{
"key": GigabitEthernet0/0",
"value": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
},
{
"key": GigabitEthernet0/1",
"value": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
}
]
提前致谢!
几个解决方案:
- name: set_fact
set_fact:
result: "{{ result | d([]) + [item.key] }}"
loop: "{{ lookup('dict', jsondata.interfaces) }}"
when: "'1' == item.value.vlan"
或使用 jinja2 循环:
- name: build
set_fact:
result: "{{ _request.strip(',').split(',') }}"
vars:
_query: "1"
_request: >-
{%- for k in jsondata.interfaces -%}
{%- if jsondata.interfaces[k].vlan == _query -%}
{{ k }},
{%- endif -%}
{%- endfor -%}
结果:
ok: [localhost] =>
result:
- GigabitEthernet0/0
- GigabitEthernet0/1
例如,下面的任务会列出 vlan=='1'
的键
- debug:
msg: "{{ interfaces|dict2items|
selectattr('value.vlan', 'eq', '1')|
map(attribute='key')|list }}"
我正在尝试使用 jmesquery 在 Ansible 中的给定 JSON 中获取满足特定条件的接口名称。
问题是列表中的项目已命名,它不是包含其中每个项目的所有值的列表,并且不知道如何过滤它。
条件是 vlan == "1" 这个 JSON 应该给出 output 类似 ['GigabitEthernet0/0', 'GigabitEthernet0/1']
在使用 dict2items 之后(正如@mdaniel 所建议的那样),我成功地应用了带条件的过滤器,但我正在努力检索现在位于 key 中的接口名称:
- name: PRINT
debug:
msg: "{{ jsondata.interfaces | dict2items | json_query( query ) }}"
vars:
query: >-
[][value][?vlan=='1']
JSON
interfaces: {
"GigabitEthernet0/0": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
},
"GigabitEthernet0/1": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
}
JSON 申请后 jsondata.interfaces | dict2items
[
{
"key": GigabitEthernet0/0",
"value": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
},
{
"key": GigabitEthernet0/1",
"value": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
}
]
提前致谢!
几个解决方案:
- name: set_fact
set_fact:
result: "{{ result | d([]) + [item.key] }}"
loop: "{{ lookup('dict', jsondata.interfaces) }}"
when: "'1' == item.value.vlan"
或使用 jinja2 循环:
- name: build
set_fact:
result: "{{ _request.strip(',').split(',') }}"
vars:
_query: "1"
_request: >-
{%- for k in jsondata.interfaces -%}
{%- if jsondata.interfaces[k].vlan == _query -%}
{{ k }},
{%- endif -%}
{%- endfor -%}
结果:
ok: [localhost] =>
result:
- GigabitEthernet0/0
- GigabitEthernet0/1
例如,下面的任务会列出 vlan=='1'
的键 - debug:
msg: "{{ interfaces|dict2items|
selectattr('value.vlan', 'eq', '1')|
map(attribute='key')|list }}"