Hi,
.I#m having a problem supplying a dictionary as parameter to a role. Seems
it's converted to Unicode and don't know how to proceed. The basic idea is
to have a task separated in a role and call it with different input
parameters during the playbook. Looks like when assigning a parameter using
"{{ }}" I almost got where I want to go (iterate over the supplied param
dict), but somehow I'm unable to do that?!
Any hint greatly appreciated!
Thanks,
Andreas
Test-inventory:
ansible@test:~$ cat test_inv.yml
---
all:
vars:
vlans:
3800:
name: TEST-VLAN-3800
otv_extended: true
3801:
name: TEST-VLAN-3801
otv_extended: true
3802:
name: TEST-VLAN-3802
otv_extended: true
test:
hosts:
localhost
Playbook:
ansible@test:~$ cat test_pb.yml
---
- name: call role and supply dict w/o jinja2 template
hosts: all
# connection: network_cli
gather_facts: no
roles:
- role: role_test
vl: vlans
tasks:
- debug:
var: vlans
- name: call role and supply dict w/ jinja2 template
hosts: all
# connection: network_cli
gather_facts: no
roles:
- role: role_test
vl: "{{ vlans }}"
Running the Playbook shows the following output:
ansible@test:~$ ansible-playbook -i test_inv.yml test_pb.yml
PLAY [call role and supply dict w/o jinja2 template]
****************************************************************************
****************************************************************************
***
TASK [role_test : show original dict]
****************************************************************************
****************************************************************************
******************
ok: [localhost] => {
"vlans": {
"3800": {
"name": "TEST-VLAN-3800",
"otv_extended": true
},
"3801": {
"name": "TEST-VLAN-3801",
"otv_extended": true
},
"3802": {
"name": "TEST-VLAN-3802",
"otv_extended": true
}
}
}
TASK [role_test : show orignal dict - vlan 3801]
****************************************************************************
****************************************************************************
*******
ok: [localhost] => {
"vlans[3801]": {
"name": "TEST-VLAN-3801",
"otv_extended": true
}
}
TASK [role_test : loop over original dict]
****************************************************************************
****************************************************************************
*************
ok: [localhost] => (item=3800) => {
"item": 3800
}
ok: [localhost] => (item=3801) => {
"item": 3801
}
ok: [localhost] => (item=3802) => {
"item": 3802
}
TASK [role_test : show supplied dict]
****************************************************************************
****************************************************************************
******************
ok: [localhost] => {
"vlans": {
"3800": {
"name": "TEST-VLAN-3800",
"otv_extended": true
},
"3801": {
"name": "TEST-VLAN-3801",
"otv_extended": true
},
"3802": {
"name": "TEST-VLAN-3802",
"otv_extended": true
}
}
}
#
# in the following section param was set without "{{ }}" and assigned as
string "vlan"
#
TASK [role_test : show supplied dict - vlan 3801]
****************************************************************************
****************************************************************************
******
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an
undefined variable. The error was:
'ansible.parsing.yaml.objects.AnsibleUnicode object' has no attribute
'3801'\n\nThe error appears to have been in
'/code/roles/role_test/tasks/main.yml': line 26, column 3, but may\nbe
elsewhere in the file depending on the exact syntax problem.\n\nThe
offending line appears to be:\n\n# error-msg:
ansible.parsing.yaml.objects.AnsibleUnicode object has no element 3801\n-
name: show supplied dict - vlan 3801\n ^ here\n"}
...ignoring
TASK [role_test : loop over supplied dict]
****************************************************************************
****************************************************************************
*************
fatal: [localhost]: FAILED! => {"msg": "Invalid data passed to 'loop', it
requires a list, got this instead: vlans. Hint: If you passed a list/dict of
just one element, try adding wantlist=True to your lookup invocation or use
q/query instead of lookup."}
...ignoring
TASK [debug]
****************************************************************************
****************************************************************************
*******************************************
ok: [localhost] => {
"vlans": {
"3800": {
"name": "TEST-VLAN-3800",
"otv_extended": true
},
"3801": {
"name": "TEST-VLAN-3801",
"otv_extended": true
},
"3802": {
"name": "TEST-VLAN-3802",
"otv_extended": true
}
}
}
#
# in the following section param was set using "{{ vlans }}"
#
PLAY [call role and supply dict w/ jinja2 template]
****************************************************************************
****************************************************************************
****
TASK [role_test : show original dict]
****************************************************************************
****************************************************************************
******************
ok: [localhost] => {
"vlans": {
"3800": {
"name": "TEST-VLAN-3800",
"otv_extended": true
},
"3801": {
"name": "TEST-VLAN-3801",
"otv_extended": true
},
"3802": {
"name": "TEST-VLAN-3802",
"otv_extended": true
}
}
}
TASK [role_test : show orignal dict - vlan 3801]
****************************************************************************
****************************************************************************
*******
ok: [localhost] => {
"vlans[3801]": {
"name": "TEST-VLAN-3801",
"otv_extended": true
}
}
TASK [role_test : loop over original dict]
****************************************************************************
****************************************************************************
*************
ok: [localhost] => (item=3800) => {
"item": 3800
}
ok: [localhost] => (item=3801) => {
"item": 3801
}
ok: [localhost] => (item=3802) => {
"item": 3802
}
TASK [role_test : show supplied dict]
****************************************************************************
****************************************************************************
******************
ok: [localhost] => {
"<type 'dict'>": "VARIABLE IS NOT DEFINED!"
}
TASK [role_test : show supplied dict - vlan 3801]
****************************************************************************
****************************************************************************
******
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an
undefined variable. The error was: 'dict object' has no attribute
'3801'\n\nThe error appears to have been in
'/code/roles/role_test/tasks/main.yml': line 26, column 3, but may\nbe
elsewhere in the file depending on the exact syntax problem.\n\nThe
offending line appears to be:\n\n# error-msg:
ansible.parsing.yaml.objects.AnsibleUnicode object has no element 3801\n-
name: show supplied dict - vlan 3801\n ^ here\n"}
...ignoring
TASK [role_test : loop over supplied dict]
****************************************************************************
****************************************************************************
*************
fatal: [localhost]: FAILED! => {"msg": "Invalid data passed to 'loop', it
requires a list, got this instead: {3800: {u'name': u'TEST-VLAN-3800',
u'otv_extended': True}, 3801: {u'name': u'TEST-VLAN-3801', u'otv_extended':
True}, 3802: {u'name': u'TEST-VLAN-3802', u'otv_extended': True}}. Hint: If
you passed a list/dict of just one element, try adding wantlist=True to your
lookup invocation or use q/query instead of lookup."}
...ignoring
PLAY RECAP
****************************************************************************
****************************************************************************
*********************************************
localhost : ok=13 changed=0 unreachable=0 failed=0
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/004801d4cddc%24cf781680%246e684380%24%40googlemail.com.
For more options, visit https://groups.google.com/d/optout.