通常在Jinja2模板中包含循环中的换行符,但是当行以{% ... %}
语句结尾时,则不包含换行符。
尝试了几件事之后,似乎一条语句在结束标记后紧紧地插入了一个换行符,而我不知道该如何停止。
这个简单的例子按我的预期工作,保留换行符:
interface Loopback0
{% for net in ipv4_networks %}
ip address {{ net }}
{% endfor %}
!
interface Loopback0
ip address 1.2.3.148 255.255.255.255
ip address 7.7.7.1 255.255.255.0
ip address 1.0.0.1 255.0.0.0
!
(注意:不是我的实际IP!)
当我在行的末尾放置一条语句,例如if
或内部for
循环时,换行符消失了!
interface Loopback0
{% for net in ipv4_networks %}
ip address {{ net }}{%- if loop.index > 1 %} secondary{% endif %}
{% endfor %}
!
interface Loopback0
ip address 1.2.3.148 255.255.255.255 ip address 7.7.7.1 255.255.255.0 secondary ip address 1.0.0.1 255.0.0.0 secondary!
如果我仅在语句末尾放置任何字符(甚至只是一个空格),则换行符将保留:
interface Loopback0
{% for net in ipv4_networks %}
ip address {{ net }}{%- if loop.index > 1 %} secondary{% endif %}foo
{% endfor %}
!
interface Loopback0
ip address 1.2.3.148 255.255.255.255foo
ip address 7.7.7.1 255.255.255.0 secondaryfoo
ip address 1.0.0.1 255.0.0.0 secondaryfoo
!
...但是,当然,我也有那些角色。
如果我添加另一个文字换行符,则保留它(两个中的一个):
interface Loopback0
{% for net in ipv4_networks %}
ip address {{ net }}{%- if loop.index > 1 %} secondary{% endif %}
{% endfor %}
!
interface Loopback0
ip address 1.2.3.148 255.255.255.255
ip address 7.7.7.1 255.255.255.0 secondary
ip address 1.0.0.1 255.0.0.0 secondary
!
这是所需的输出!但是我不想在其中添加多余的换行符,而且看来我应该能够修改这种行为。
我设置了lstrip_blocks
。因此,我不需要像this question那样删除任何空格。
The official doc on whitespace control描述了使用-
删除空格,并使用+
保留空格,但没有涵盖此特定情况。在示例中,我尝试将加号放在每个语句的开头和结尾,但没有一个得到期望的输出。
Python 3.7.3
Jinja2 2.10.1
PyYaml 5.1
ansible 2.7.10