如何在Ansible中从字典中提取深度嵌套的数据

时间:2020-04-01 20:12:45

标签: ansible

我正在尝试从ansible字典中打印嵌套数据。但是,我不知道如何拉嵌套的值。具体来说,在下面的数据中,我试图打印在“ ipv4”下返回的两个值。当前,item.value.ipv4的输出是下面方括号中的部分:

"msg": "GigabitEthernet0/0/0,[{'address': '192.168.3.1', 'subnet': '28'}]"  

我只想像这样使用值:

"msg": "GigabitEthernet0/0/0, 192.168.3.1, 28"

我不知道如何从嵌套数据中提取数据。简而言之,如果这样的事情起作用,那就太好了:item.value.ipv4 ['address']。怎么做?

  tasks:

    - name: get config for Cisco IOS
      ios_facts:
        gather_subset: all
        gather_network_resources: interfaces

   - name: create dictionary with ansible_net_interfaces
      set_fact:
        foo_value: "{{ query('dict', ansible_net_interfaces) }}"

    - name: display the results of foo_value
      debug:
        msg: "{{ foo_value }}"

    - name: display certain detalys values from foo_value
      debug:
        msg: "{{ item.key }},{{ item.value.ipv4 }}"
      with_items: "{{ foo_value }}" 

这些任务产生以下内容:

TASK [display the results of foo] **********************************************************************************************************************
ok: [192.168.3.1] => {
    "msg": [
        {
            "key": "GigabitEthernet0/0/0",
            "value": {
                "bandwidth": 1000000,
                "description": "This is an interface description",
                "duplex": "Full",
                "ipv4": [
                    {
                        "address": "192.168.3.1",
                        "subnet": "28"
                    }
                ],
                "lineprotocol": "up",
                "macaddress": "50f7.123c.b0c0",
                "mediatype": "RJ45",
                "mtu": 1500,
                "operstatus": "up",
                "type": "ISR4331-3x1GE"
            }
        },
        {
            "key": "GigabitEthernet0/0/1",
            "value": {
                "bandwidth": 1000000,
                "description": "This is another interface description",
                "duplex": "Full",
                "ipv4": [
                    {
                        "address": "192.168.3.33",
                        "subnet": "30"
                    }
                ],
                "lineprotocol": "up",
                "macaddress": "50f7.123c.b0c0",
                "mediatype": "RJ45",
                "mtu": 1500,
                "operstatus": "up",
                "type": "ISR4331-3x1GE"
            }
        },
    ]
}

1 个答案:

答案 0 :(得分:2)

ipv4是词典的列表。假设您只需要第一本字典

    - name: display certain detalys values from foo_value
      debug:
        msg: "{{ item.key }},{{ item.value.ipv4[0].address }},{{ item.value.ipv4[0].subnet }}"
      when: item.value.ipv4 is defined and item.value.ipv4[0].subnet is defined and item.value.ipv4[0].address is defined 
      with_items: "{{ foo_value }}"