help on loop over list of dicts

76 views
Skip to first unread message

Mgsz

unread,
Dec 9, 2015, 6:28:40 PM12/9/15
to Ansible Project
Error when try to iterate a list:
This is what I am using in the playbook:
...
  - debug: msg="{{ dev_interfaces[0].name }}"

  - name: debug message interface name
    debug: msg="{{item.name}}"
    with_items: "{{ dev_interfaces }}"
...

When executing, the loop always get error, any suggestion?

TASK [debug msg={{ dev_interfaces[0].name }}] ****************************
ok: [10.3.146.113] => {
    "changed": false,
    "invocation": {
        "module_args": {
            "msg": "Ethernet0"
        },
        "module_name": "debug"
    },
    "msg": "Ethernet0"
}
TASK [debug message interface name] **********************************
fatal: [10.3.146.113]: FAILED! => {"failed": true, "msg": "ERROR! dict object has no element {u'subnet': u'10.0.0.0/31', u'peer_addr': u'10.0.0.1', u'name': u'Ethernet0', u'mask': u'255.255.255.254', u'prefixlen': 31, u'addr': u'10.0.0.0'}"}

Mike Biancaniello

unread,
Dec 10, 2015, 11:16:05 AM12/10/15
to Ansible Project
Not sure what you're doing wrong. Maybe it's the way you define dev_interfaces (yeah, it makes no sense why it would work in debug, but not in with_items, but sometimes that happens).

This worked for me:
---
- name: stuff
  connection
: local
  gather_facts
: no
  hosts
: localhost

  vars
:
    dev_interfaces
:
     
- subnet: 10.0.0.0/31
        peer_addr
: 10.0.0.1
        name
: Ethernet0
        mask
: 255.255.255.254
        prefixlen
: 31
        addr
: 10.0.0.0

  tasks
:

   
- debug: msg="{{ dev_interfaces[0].name }}"

   
- name: debug message interface name
      debug
: msg="{{item.name}}"
      with_items
: "{{ dev_interfaces }}"


output:
PLAY [stuff] ******************************************************************

TASK
: [debug msg="{{ dev_interfaces[0].name }}"] ******************************
ok
: [localhost] => {
   
"msg": "Ethernet0"
}

TASK
: [debug message interface name] ******************************************
ok
: [localhost] => (item={'subnet': '10.0.0.0/31', 'peer_addr': '10.0.0.1', 'name': 'Ethernet0', 'prefixlen': 31, 'mask': '255.255.255.254', 'addr': '10.0.0.0'}) => {
   
"item": {
       
"addr": "10.0.0.0",
       
"mask": "255.255.255.254",
       
"name": "Ethernet0",
       
"peer_addr": "10.0.0.1",
       
"prefixlen": 31,
       
"subnet": "10.0.0.0/31"
   
},
   
"msg": "Ethernet0"
}

PLAY RECAP
********************************************************************
localhost                  
: ok=2    changed=0    unreachable=0    failed=0  




Mgsz

unread,
Dec 10, 2015, 12:56:19 PM12/10/15
to Ansible Project
Thank you Mike for the reply!
One of my co-worker helped me out. Basically, I was using nested with_items in two playbook.
I have playbook1 running with_items to include playbook2 with tasks which also trying to use with_items, so it failed in the 2nd playbook which the with_items are not looping using new value, still using the items in playbook1.

Ansible team, is what I described correct? I think I may need to redo the playbook with with_nested see if I can make it work.

Brian Coca

unread,
Dec 18, 2015, 6:09:10 PM12/18/15
to Ansible Project
inside the include you need to use `set_fact: outside={{item}}`
otherwise the other with_items will overwrite the 'item' var


--
Brian Coca
Reply all
Reply to author
Forward
0 new messages