如何在Jinja2中缩进嵌套的if / for语句

时间:2019-09-10 06:00:47

标签: nested ansible jinja2 indentation

我有一个很长的Jinja2模板,其中包含许多嵌套的if / for语句。很难读。我想缩进{% %}位,以使其更清楚。 但是,如果我这样做,这些块的内容也会缩进更多的地方。

如何缩进{% %}位的 just

我正在使用Ansible。

复制步骤:

template.yaml.j2

{% for x in range(3) %}
Key{{ x }}:
   # The following should be one list
   - always here
   {% if x % 2 %}
   - sometimes here
   {% endif %}
{% endfor %}

playbook.yaml

---
- hosts: localhost
  connection: local

  tasks:
    - template:
        src: template.j2
        dest: template.yaml

运行ansible-playbook playbook.yaml

所需的输出

Key0:
   # The following should be one list
   - always here
Key1:
   # The following should be one list
   - always here
   - sometimes here
Key2:
   # The following should be one list
   - always here

实际行为:

Key0:
   # The following should be one list
   - always here
   Key1:
   # The following should be one list
   - always here
      - sometimes here
   Key2:
   # The following should be one list
   - always here

解决方法

如果我取消缩进if语句,例如:

{% for x in range(3) %}
Key{{ x }}:
   # The following should be one list
   - always here
{% if x % 2 %}
   - sometimes here
{% endif %}
{% endfor %}

然后我得到想要的输出。 但是问题是这很难读。 (在我的实际模板中,我在内部if语句中包含if语句,等等。高度嵌套。)

1 个答案:

答案 0 :(得分:4)

  

问:如何在jinja2中缩进嵌套的if / for语句?

A:关闭默认修整并手动 ltrim 仅缩进控制语句 {%-

例如,下面的模板可以满足您的需求

#jinja2: trim_blocks:False
{% for x in range(3) %}
Key{{ x }}:
   # The following should be one list
   - always here
   {%- if x % 2 %}
   - sometimes here
   {%- endif %}
{%- endfor %}

请参见Whitespace Control


笔记

  • {%-endfor%} 中的破折号删除了键之间的空行。
  • 默认参数“ trim_blocks:是” 。参见template