避免在 Jinja2 模板中的一组 if+for 之后换行缩进

Avoid indentation on a newline after a set of if+for in a Jinja2 template

所以我有这个模板:

array (
  {% if dict is defined %}
  {% for key, value in dict.items() %}
  '{{ key }}' => {{ value }},
  {% endfor %}
  {% endif %}
),

我知道我需要在某些 {% / %} 字符上附加破折号,但我找不到正确的组合。这是预期的结果:

array (
  'key1' => value1,
  'key2' => value2,
  ...
),

到目前为止,这是最接近我想要的组合:

array (
  {% if dict is defined -%}
  {% for key, value in dict.items() -%}
  '{{ key }}' => {{ value }},
  {% endfor -%}
  {% endif -%}
),

结果:

array (
  'key1' => value1,
  'key2' => value2,
  ...
  'keyN' => valueN,
  ), <- this should not be indented

请注意,我尝试了类似案例中提到的解决方案:

但对我也不起作用,导致整个输出都写在同一行上。

我尝试了更多的组合,但 none 到目前为止它们都有效,其中大多数导致所有 kay-value 对都写在同一行上。人群中有没有人对 Jinja 更有经验并且知道如何正确使用它?

为了实现这一点,您还必须使用 Jinja2 trim_blocks 环境参数。

此处在 debug 任务中进行了演示,但同样的注释行当然可以添加到任何 *.j2 处理的文件的开头template 模块。

所以神奇的评论行是:

#jinja2: trim_blocks:False

另请注意,为了降低控制空白的两个块的复杂性,我使用了 for ... if 结构。

所以根据剧本:

- hosts: all
  gather_facts: no

  tasks:
    - debug:
        msg: |
          #jinja2: trim_blocks:False
          array (
            {%- for key, value in dict.items() if dict is defined %}
            '{{ key }}' => {{ value }},
            {%- endfor %}
          ),
      vars:
        dict: 
          lorem: ipsum
          dolor: sit

这给出了输出:

PLAY [all] **********************************************************************************************************

TASK [debug] ********************************************************************************************************
ok: [localhost] => {
    "msg": "array (\n  'lorem' => ipsum,\n  'dolor' => sit,\n),\n"
}

PLAY RECAP **********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0