Home > Enterprise >  Looping through complex dictionary with Ansible
Looping through complex dictionary with Ansible

Time:09-23

I'm using the Cisco ACI_REST module. I'm building a playbook to shutdown all of my ACI EPGs. The ACI_EPG module is used to create the dict.

- name: Get List of EPGs
       cisco.aci.aci_epg:
         host: "{{ inventory_hostname }}"
         username: "{{ ansible_user }}"
         password: "{{ ansible_password }}"
         validate_certs: no
         state: query
       delegate_to: localhost
       register: epg_list

It creates a dictionary that looks like this:

  "item": {
        "key": "current",
        "value": [
            {
                "fvAEPg": {
                    "attributes": {
                        "dn": "uni/tn-PC/ap-PROD_AP/epg-VLAN80_EPG",
                        "shutdown": "no",
                     },
                    "children": [
                        {
                            "fvRsBd": {
                                "attributes": {
                                    "annotation": "",
                                    "tDn": "uni/tn-PC/BD-VLAN80_BD",
                                    "tRn": "BD-VLAN80_BD",
                                    "tType": "name",
                                    "tnFvBDName": "VLAN80_BD",
                                    "uid": "0"
                                },
                                "children": [
                                    {
                                        "fvSubnetBDDefCont": {
                                            "attributes": {
                                                "name": "",
                                                "nameAlias": "",
                                                "status": ""
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            }

I need to loop through the DN values.

"dn": "uni/tn-PC/ap-PROD_AP/epg-VLAN80_EPG"

I'm playing with dict2items but am stuck. How to I reference the nested items in my dictionary? Here is some test code that I'm working with.

- name: Display EPG List
       ansible.builtin.debug:
         msg: "{{ item.key }} - {{ item.value }}"
       loop: "{{ epg_list | dict2items }}"  

Thanks,

CodePudding user response:

Q: "Loop through the DN values."

A: Try json_query, e.g.

    - debug:
        msg: "{{ item }}"
      loop: "{{ epg_list.item.value|
                json_query('[].*.attributes.dn')|
                flatten }}"

gives

  msg: uni/tn-PC/ap-PROD_AP/epg-VLAN80_EPG

Given the data

  epg_list:
    item:
      key: current
      value:
      - fvAEPg:
          attributes:
            dn: uni/tn-PC/ap-PROD_AP/epg-VLAN80_EPG
            shutdown: 'no'
          children:
          - fvRsBd:
              attributes:
                annotation: ''
                tDn: uni/tn-PC/BD-VLAN80_BD
                tRn: BD-VLAN80_BD
                tType: name
                tnFvBDName: VLAN80_BD
                uid: '0'
              children:
              - fvSubnetBDDefCont:
                  attributes:
                    name: ''
                    nameAlias: ''
                    status: ''

If the data is

  epg_list:
    current:
    - fvAEPg:
        attributes:
          dn: uni/tn-PC/ap-PROD_AP/epg-VLAN80_EPG
          shutdown: 'no'
        children:
        - fvRsBd:
            attributes:
              annotation: ''
              tDn: uni/tn-PC/BD-VLAN80_BD
              tRn: BD-VLAN80_BD
              tType: name
              tnFvBDName: VLAN80_BD
              uid: '0'
            children:
            - fvSubnetBDDefCont:
                attributes:
                  name: ''
                  nameAlias: ''
                  status: ''

the task below gives the same result

    - debug:
        msg: "{{ item }}"
      loop: "{{ epg_list.current|
                json_query('[].*.attributes.dn')|
                flatten }}"
  • Related