How do I get an Ansible template to honor new line

2019-02-12 02:48发布

问题:

The template looks like this:

solr.replication.master=
    {% if ansible_eth0.ipv4.address == servermaster.eth0 %}
        false
    {% else %}
        true
    {% endif %}

solr.replication.slave=false

And the output should look like this:

solr.replication.master=true
solr.replication.slave=false

What I am actually getting is:

solr.replication.master=truesolr.replication.slave=false

I understand that Jinja2 strips whitespace, and that ansible is probably configuring this by default. But it does not seem to honor -/+ whitespace tags.

Is there a way to force a line break?

回答1:

Add the following line to your template at first position:

#jinja2: trim_blocks:False


回答2:

Google brought me here, so leaving this answer for prosperity's sake.

As you mentioned -/+ whitespace tags are not honored, nor are line macros enabled (at least not %% or # or ##).

trim_blocks is enabled in ansible. The only thing that I found that does work, is that trim_blocks ignores only the first newline

For your example, just adding an extra newline should be sufficient

solr.replication.master={% if ansible_eth0.ipv4.address == servermaster.eth0 %}false{% else %}true{% endif %}

solr.replication.slave=false


回答3:

I had the same issue. I solved it by adding

{{''}}

to the end of the line, for example:

solr.replication.master={% if ansible_eth0.ipv4.address == servermaster.eth0 %}false{% else %}true{% endif %}{{''}}

This inserts an empty string literal, with the side effect that whitespace is not stripped.



回答4:

I believe using a ternary filter might help.

solr.replication.master={{ (ansible_eth0.ipv4.address == servermaster.eth0) | ternary('false', 'true') }}
solr.replication.slave=false


回答5:

As workaround you can add to your template

{% raw %}{% endraw %}


回答6:

Looks like you have force=no in the ansible playbook so the file will not be overwritten.