【问题标题】:Ansible loop over nested dictionary嵌套字典上的 Ansible 循环
【发布时间】:2018-11-20 23:05:30
【问题描述】:

我从 API 调用返回了以下数据

"napalm_interfaces_ip": {
    "Vlan5": {
        "ipv4": {
            "10.45.230.250": {
                 "prefix_length": 24
            }
        }
     }
 }

如何调试打印 Vlan 信息、IP 和前缀长度?

这就是我所拥有的

- debug:
     msg: "Interface: {{ item.key }}, IP: {{ item.value.ipv4 }}"
  with_dict:
     - "{{ napalm_interfaces_ip }}"

它产生以下输出,显示 IP 指向另一个字典

任务 [validate_device_ips : 调试]


ok: [] => (item={'value': {u'ipv4': {u'10.45.230.250': {u'prefix_length': 24}}}, 'key': u'Vlan5'}) => { "msg": "接口:Vlan5,IP:{u'10.45.230.250': {u'prefix_length': 24}}" }

【问题讨论】:

    标签: ansible


    【解决方案1】:

    dict2items 应该有帮助:

    - debug:
        msg: "IP: {{ item.key }} prefix_length: {{ item.value.prefix_length }}"
      loop: "{{ napalm_interfaces_ip.Vlan5.ipv4 | dict2items }}"
    

    with_dict 也有效

    - debug:
        msg: "IP: {{ item.key }} prefix_length: {{ item.value.prefix_length }}"
      with_dict: "{{ napalm_interfaces_ip.Vlan5.ipv4 }}"
    

    如何循环接口的示例如下

    - hosts: localhost
      gather_facts: no
      vars:
        interfaces:
          - Vlan0:
              ipv4:
                10.45.230.250:
                  prefix_length: 24
          - Vlan1:
              ipv4:
                10.45.230.251:
                  prefix_length: 24
          - Vlan2:
              ipv4:
                10.45.230.252:
                  prefix_length: 24
      tasks:
        - name: List selected variables
          vars:
            msg: |
              vlan {{ item|dict2items|json_query('[].key') }}
              ip {{ item|dict2items|json_query('[].value.ipv4|[0]')|dict2items|json_query('[].key') }}
              prefix {{ item|dict2items|json_query('[].value.ipv4|[0]')|dict2items|json_query('[].value.prefix_length') }}
          debug:
            msg: "{{ msg.split('\n') }}"
          loop: "{{ interfaces }}"
    

    一旦你决定让你的生活更轻松,下面是一个选项

    - hosts: localhost
      vars:
        interfaces:
          - Vlan0:
              ipv4: "10.45.230.250"
              prefix_length: "24"
          - Vlan1:
              ipv4: "10.45.230.251"
              prefix_length: "24"
          - Vlan2:
              ipv4: "10.45.230.252"
              prefix_length: "24"
      tasks:
        - name: List selected variables
          vars:
            msg: |
              vlan {{ item|dict2items|json_query('[].key') }}
              ip {{ item|dict2items|json_query('[].value.ipv4') }}
              prefix {{ item|dict2items|json_query('[].value.prefix_length') }}
          debug:
            msg: "{{ msg.split('\n') }}"
          loop: "{{ interfaces }}"
    

    【讨论】:

    • 您好弗拉基米尔...谢谢您的回复。我实际上需要打印接口名称,即 Vlan5,然后提取嵌套的 IP 信息和前缀。也可能有多个带有 IP 的 vlan,所以我需要找到一种方法来遍历它。
    • 是的,我试过了,但这不是我想要的解决方案。 vlan 不能嵌入到循环中,因为该信息会随着每次 API 调用而变化。也可能有多个 vlan 返回 IP,因此必须考虑
    • 非常感谢您再次对此进行调查。我很欣赏你的回应。我使用上面的代码和我得到的错误消息进行了测试。它似乎不适用于我从系统收到的字典信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2022-06-15
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多