Variable within variable

25 views
Skip to first unread message

Spiro Mitsialis

unread,
Aug 5, 2019, 12:53:30 PM8/5/19
to Ansible Project
I have the following and there may be several vlans per switch.  
    "cisco_ios.vlans": {
        "35": {
            "id": "35",
            "mtu": "1500",
            "name": "CC_internal_subnet_35",
            "ports": [
                "GigabitEthernet1/0/1",
                "GigabitEthernet1/0/2",
                "GigabitEthernet1/0/20"
            ],
            "status": "active"
        },
        "499": {
            "id": "499",
            "mtu": "1500",
            "name": "Lync_VoIP_Burnside1",
            "ports": [
                ""
            ],
            "status": "active"
        }
    }

I want to be able to reference the data in here.  Example, I am looking to loop through al *.ports.  I'm trying to do the following which does not work

 vars:
   old_vlan: 35
   new_vlan: 45

  - name: Change vlan old_vlan to new_vlan for all ports in list
    debug:
      msg: "Old VLAN is {{ old_vlan }} and port {{ item }} needs to be changed"
    loop: '{{ cisco_ios.vlans["{{ old_vlan }}"].ports }}'

The following work:      loop: '{{ cisco_ios.vlans["35"].ports }}'
but how do I substitute 35 with the variable old_vlan which contains 35? 


Kai Stian Olstad

unread,
Aug 5, 2019, 1:18:55 PM8/5/19
to ansible...@googlegroups.com
On 05.08.2019 18:53, Spiro Mitsialis wrote:
> I have the following and there may be several vlans per switch.
> "cisco_ios.vlans": {
> "35": {
> "id": "35",
> "mtu": "1500",
> "name": "CC_internal_subnet_35",
> "ports": [
> "GigabitEthernet1/0/1",
> "GigabitEthernet1/0/2",
> "GigabitEthernet1/0/20"
> ],
> "status": "active"
> },
> "499": {
> "id": "499",
> "mtu": "1500",
> "name": "Lync_VoIP_Burnside1",
> "ports": [
> ""
> ],
> "status": "active"
> }
> }

Your vlans are string because of the quotes around 35 and 499.


> I want to be able to reference the data in here. Example, I am looking to
> loop through al *.ports. I'm trying to do the following which does not work
>
> vars:
> old_vlan: 35
> new_vlan: 45

You are here making variables with int.


> - name: Change vlan old_vlan to new_vlan for all ports in list
> debug:
> msg: "Old VLAN is {{ old_vlan }} and port {{ item }} needs to be
> changed"
> loop: '{{ cisco_ios.vlans["{{ old_vlan }}"].ports }}'

You can't have nested {{ }}, if you are in template mode you are in template mode so just loose the inner {{ }}.
But since your data is a string and you variable is a int you would need to filter you int's to a string

loop: '{{ cisco_ios.vlans[old_vlan | string].ports }}'

Or change old_vlan to a strings and do

loop: '{{ cisco_ios.vlans[old_vlan].ports }}'


--
Kai Stian Olstad
Reply all
Reply to author
Forward
0 new messages