Question:
I have the following vars
inside of my ansible playbook I got the following structure
1 2 3 4 5 |
domains: - { main: 'local1.com', sans: ['test.local1.com', 'test2.local.com'] } - { main: 'local3.com' } - { main: 'local4.com' } |
And have the following inside of the my conf.j2
1 2 3 4 5 6 7 8 9 10 11 12 |
{% for domain in domains %} [[acme.domains]] {% for key, value in domain.iteritems() %} {% if value is string %} {{ key }} = "{{ value }}" {% else %} {{ key }} = {{ value }} {% endif %} {% endfor %} {% endfor %} |
Now when I go in the VM and see the file I get the following:
Output
1 2 3 4 5 6 7 8 |
[[acme.domains]] main = "local1.com sans = [u'test.local1.com', u'test2.local.com'] [[acme.domains]] main = "local3.com" [[acme.domains]] main = "local4.com" |
Notice the u inside of the sans
array.
Excpeted output
1 2 3 4 5 6 7 8 |
[[acme.domains]] main = "local1.com" sans = ["test.local1.com", "test2.local.com"] [[acme.domains]] main = "local3.com" [[acme.domains]] main = "local4.com" |
Why is this happening and how can I fix it?
Answer:
You get u' '
because you print the object containing the Unicode strings and this is how Python renders it by default.
You can filter it with list | join
filters:
1 2 3 4 5 6 7 8 9 10 11 |
{% for domain in domains %} [[acme.domains]] {% for key, value in domain.iteritems() %} {% if value is string %} {{ key }} = "{{ value }}" {% else %} {{ key }} = ["{{ value | list | join ('\',\'') }}"] {% endif %} {% endfor %} {% endfor %} |
Or you can rely on the fact, that the string output after sans =
is a JSON and render it with to_json
filter:
1 2 |
{{ key }} = {{ value | to_json }} |
Either will get you:
1 2 3 4 5 6 7 8 |
[[acme.domains]] main = "local1.com" sans = ["test.local1.com", "test2.local.com"] [[acme.domains]] main = "local3.com" [[acme.domains]] main = "local4.com" |
But the first one is more versatile.