jinja 模板在 if 条件不满足时添加额外的行

问题描述 投票:0回答:1
我的 jinja 模板中的

for loop
是这样的

{% for m in grp %}
abc {{ m.length }}
      pqr
      xyz
{% if m.flag is defined and m.flag == "f" %}
      yes f {% endif %}    
{% for r in uv %}
      abcdef
{% endfor %}

{% endfor %} 

现在的问题是

grp
的某些成员没有
flag
变量。只要存在
flag
,就会正确添加
option true
行。但是当if条件不满足时,它只是添加一个空行。这 4 或 5 行应该没有额外的空行,否则生成的配置文件将被标记为无效。 谁能帮我解决这个问题吗?

ansible jinja2
1个回答
4
投票

问:不满足条件则添加空行。

A:请参阅空白控制。引用:

如果在块(例如 For 标签)、注释或变量表达式的开头或结尾添加减号 (-),则该块之前或之后的空格将被删除。

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

{% if m.flag is defined and m.flag == "f" %}
    yes f
{% endif -%}

例如,给定数据

    grp:
      - {length: 1, flag: x}
      - {length: 2}
      - {length: 3, flag: f}
      - {length: 4, flag: f}
  • 您的问题的简化模板
    {% for m in grp %}
        {{ m.length }}
        xyz
    {% if m.flag is defined and m.flag == "f" %}
        yes f {% endif %}    
    {% endfor %}

添加空行

        1
        xyz
  
        2
        xyz
  
        3
        xyz
        yes f
        4
        xyz
        yes f
  • 如果使用减号
    {% for m in grp %}
        {{ m.length }}
        xyz
    {% if m.flag is defined and m.flag == "f" %}
        yes f
    {% endif -%}    
    {% endfor %}

没有空行

        1
        xyz
        2
        xyz
        3
        xyz
        yes f
        4
        xyz
        yes f
  • 条件可以简化。下面的模板给出了相同的结果
    {% for m in grp %}
        {{ m.length }}
        xyz
    {% if m.flag|default('') == "f" %}
        yes f
    {% endif -%}    
    {% endfor %}

用于测试的完整剧本示例

- hosts: localhost

  vars:

    grp:
      - {length: 1, flag: x}
      - {length: 2}
      - {length: 3, flag: f}
      - {length: 4, flag: f}

  tasks:

    - debug:
        msg: |
          {% for m in grp %}
              {{ m.length }}
              xyz
          {% if m.flag is defined and m.flag == "f" %}
              yes f {% endif %}    
          {% endfor %}
      tags: t1

    - debug:
        msg: |
          {% for m in grp %}
              {{ m.length }}
              xyz
          {% if m.flag is defined and m.flag == "f" %}
              yes f
          {% endif -%}    
          {% endfor %}
      tags: t2

    - debug:
        msg: |
          {% for m in grp %}
              {{ m.length }}
              xyz
          {% if m.flag|d('') == "f" %}
              yes f
          {% endif -%}    
          {% endfor %}
      tags: t3
© www.soinside.com 2019 - 2024. All rights reserved.