解析嵌套 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 }}"