concatenate a value with another variable in default filter

6,407 views
Skip to first unread message

Nicolas G

unread,
Jan 5, 2017, 9:10:58 AM1/5/17
to Ansible Project
I have the bellow Ansible inventory :

[web:children]
web
-eu-west
web
-us-east
[eu:vars]
dc
=eu-west
[eu:children]
web
-eu-west
[us:vars]
dc
=us-east
[us:children]
web
-us-east


The bellow is working fine in my playbook  :
-- hosts: "{{  hosts | default('web') }}"


Unfortunately we have a case now where we need to combine the dc variable in the default filter , I'm trying the bellow two combinations with errors :

- hosts: "{{ hosts | default('web-'dc) }}"
ERROR! template error while templating string: expected token ',', got 'dc'. String: {{ hosts | default('web-'dc) }}

- hosts: "{{ hosts | default('bid-'+ dc) }}"
ERROR! the field 'hosts' has an invalid value, which appears to include a variable that is undefined. The error was: 'dc' is undefined

What is the right way to concatenate a value and a var using the default filter ?

Johannes Kastl

unread,
Jan 5, 2017, 10:07:13 AM1/5/17
to ansible...@googlegroups.com
On 05.01.17 15:10 Nicolas G wrote:
> - hosts: "{{ hosts | default('web-'dc) }}"

Try this:

- hosts: "{{ hosts | default([ [ 'web-', dc ] | join ] ) }}"
or
- hosts: "{{ hosts | default([ 'web-', dc ] | join ) }}"

Not sure if you need two sets of square brackets.

Johannes

signature.asc

Matt Martz

unread,
Jan 5, 2017, 10:46:00 AM1/5/17
to ansible...@googlegroups.com
Your general approach is pretty much correct in your last example:

- hosts: "{{ hosts | default('bid-'+ dc) }}"

Although jinja2 recommends using a `~` instead of `+` for string concatenation, although both will work.

However, the real problem is with your variable.  You have created the `dc` variable in your inventory, which means that it is scoped to the hosts within that group.  Because you are using the `dc` variable in your `hosts` declaration, no hosts have been targeted, and additionally, the `dc` variable is per host, not global.

As such, you cannot use the `dc` variable in a hosts declaration due to variable scoping, and the `dc` variable not being defined at that point.

The only real place to define a variable that can be used in the `hosts` declaration is via the command line via -e/--extra-vars

--
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 ansible-project+unsubscribe@googlegroups.com.
To post to this group, send email to ansible-project@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/1a96a93f-11a3-485a-be73-58beeb046c6f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
Matt Martz
@sivel
sivel.net

Nicolas G

unread,
Jan 5, 2017, 12:05:39 PM1/5/17
to Ansible Project
Got it Matt , that makes sense.

Thanks .
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages