Greetings fellow Ansible users!

I have a use case where I want to add values to a list dependant on host 
groups. I will then use the resulting list as an argument to another task.

It's important than I don't have duplicate values in the list, so I am 
using union() to add new items to the list, as indicated 
by http://docs.ansible.com/ansible/playbooks_filters.html

For some reason, as soon as a set_fact task is run against the same host 
and variable for a second time, Ansible explodes with an unintuitive 
Python/Jinja2 error, saying it's getting a list when it doesn't expect a 
list (which makes NO sense to me, because union() wants two lists are 
arguments surely?!).

*fatal: [host4-uk] => Failed to template fruit="{{ fruit | union([ 
'Goosberry', 'Blackberry' ]) }}": an unexpected type error occurred. Error 
was coercing to Unicode: need string or buffer, list found*


Can anybody shed any light on this? Am I doing something particularly 
silly? Is there a better way to achieve what I want to do?

To illustrate the problem, I have tried to distill the issue down to this 
simple example:

*nicola $ ls -1 **
*fruit.yaml*
*inventory*

*group_vars:*
*all*


*nicola $ cat group_vars/all*
* fruit:*
*   - UniversalFruit1-Foo*


*nicola $ cat inventory*
*[tropical]*
*host1-asia ansible_ssh_host=172.18.32.89*
*host2-asia ansible_ssh_host=172.18.97.157*

*[domestic]*
*host3-uk ansible_ssh_host=172.18.128.12*
*host4-uk ansible_ssh_host=172.18.128.13*

*[berries]*
*host4-uk ansible_ssh_host=172.18.128.13*


*nicola $ cat fruit.yaml*
*---*

*- hosts: all*
*  tasks:*
*    - debug: var=fruit*

*- hosts: tropical*
*  tasks:*
*    - set_fact: fruit="{{ fruit | union([ 'Kiwi', 'Mango' ]) }}" #"*

*- hosts: all*
*  tasks:*
*    - debug: var=fruit*

*- hosts: domestic*
*  tasks:*
*    - set_fact: fruit="{{ fruit | union([ 'Apple', 'Blackberry' ]) }}" #"*

*- hosts: all*
*  tasks:*
*    - debug: var=fruit*

*- hosts: berries*
*  tasks:*
*    - set_fact: fruit="{{ fruit | union([ 'Goosberry', 'Blackberry' ]) }}" 
#"*

*- hosts: all*
*  tasks:*
*    - debug: var=fruit*

*- hosts: all*
*  tasks:*
*    - set_fact: fruit="{{ fruit | union([ 'UniversalFruit1-Foo', 
'UniversalFruit2-Bar' ]) }}" #"*

*- hosts: all*
*  tasks:*
*    - debug: var=fruit*


*nicola $ ansible-playbook -i inventory fruit.yaml*

*PLAY [all] 
*********************************************************************

*GATHERING FACTS 
****************************************************************
*ok: [host3-uk]*
*ok: [host4-uk]*
*ok: [host1-asia]*
*ok: [host2-asia]*

*TASK: [debug var=fruit] 
********************************************************
*ok: [host1-asia] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo"*
*        ]*
*    }*
*}*
*ok: [host2-asia] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo"*
*        ]*
*    }*
*}*
*ok: [host4-uk] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo"*
*        ]*
*    }*
*}*
*ok: [host3-uk] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo"*
*        ]*
*    }*
*}*

*PLAY [tropical] 
****************************************************************

*GATHERING FACTS 
****************************************************************
*ok: [host1-asia]*
*ok: [host2-asia]*

*TASK: [set_fact fruit="{{ fruit | union([ 'Kiwi', 'Mango' ]) }}"] 
**************
*ok: [host1-asia]*
*ok: [host2-asia]*

*PLAY [all] 
*********************************************************************

*GATHERING FACTS 
****************************************************************
*ok: [host3-uk]*
*ok: [host4-uk]*
*ok: [host1-asia]*
*ok: [host2-asia]*

*TASK: [debug var=fruit] 
********************************************************
*ok: [host4-uk] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo"*
*        ]*
*    }*
*}*
*ok: [host1-asia] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo",*
*            "Kiwi",*
*            "Mango"*
*        ]*
*    }*
*}*
*ok: [host2-asia] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo",*
*            "Kiwi",*
*            "Mango"*
*        ]*
*    }*
*}*
*ok: [host3-uk] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo"*
*        ]*
*    }*
*}*

*PLAY [domestic] 
****************************************************************

*GATHERING FACTS 
****************************************************************
*ok: [host3-uk]*
*ok: [host4-uk]*

*TASK: [set_fact fruit="{{ fruit | union([ 'Apple', 'Blackberry' ]) }}"] 
********
*ok: [host3-uk]*
*ok: [host4-uk]*

*PLAY [all] 
*********************************************************************

*GATHERING FACTS 
****************************************************************
*ok: [host4-uk]*
*ok: [host3-uk]*
*ok: [host1-asia]*
*ok: [host2-asia]*

*TASK: [debug var=fruit] 
********************************************************
*ok: [host2-asia] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo",*
*            "Kiwi",*
*            "Mango"*
*        ]*
*    }*
*}*
*ok: [host1-asia] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo",*
*            "Kiwi",*
*            "Mango"*
*        ]*
*    }*
*}*
*ok: [host4-uk] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo",*
*            "Apple",*
*            "Blackberry"*
*        ]*
*    }*
*}*
*ok: [host3-uk] => {*
*    "var": {*
*        "fruit": [*
*            "UniversalFruit1-Foo",*
*            "Apple",*
*            "Blackberry"*
*        ]*
*    }*
*}*

*PLAY [berries] 
*****************************************************************

*GATHERING FACTS 
****************************************************************
*ok: [host4-uk]*

*TASK: [set_fact fruit="{{ fruit | union([ 'Goosberry', 'Blackberry' ]) 
}}"] ****
*fatal: [host4-uk] => Failed to template fruit="{{ fruit | union([ 
'Goosberry', 'Blackberry' ]) }}": an unexpected type error occurred. Error 
was coercing to Unicode: need string or buffer, list found*

*FATAL: all hosts have already failed -- aborting*

*PLAY RECAP 
*********************************************************************
*           to retry, use: --limit @/home/nworthington/fruit.yaml.retry*

*host1-asia                 : ok=8    changed=0    unreachable=0   
 failed=0*
*host2-asia                 : ok=8    changed=0    unreachable=0   
 failed=0*
*host3-uk                   : ok=8    changed=0    unreachable=0   
 failed=0*
*host4-uk                   : ok=9    changed=0    unreachable=1   
 failed=0*

*nicola $*

-- 
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/7b1393ee-8a1e-4dfa-94fe-18444a8a8e65%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to