【问题标题】:Short version of if var is defined for ansible templates为 ansible 模板定义了 if var 的简短版本
【发布时间】:2016-06-17 11:33:48
【问题描述】:

Ansible 模板中的 Jinja2 允许在模板中使用这种类型的表达式:

{% if foobar is defined %} foo_bar = {{foobar}} {% endif %}
{% if barfoo is defined %} bar_foo = {{barfoo}} {% endif %}

等等

是否有任何较短的版本说'如果未定义变量,则不要打印此行?

类似 foo_bar = {{foobar|skip_this_line_if_undefined}} 的东西?

【问题讨论】:

    标签: ansible jinja2 ansible-template


    【解决方案1】:

    您可以使用default(omit) 过滤器。详情请看documentation

    【讨论】:

    • 我在模板中需要它们。当我在模板中使用默认(省略)(如:foo={{foo|default(omit)}})时,它会产生:foo=__omit_place_holder__36742c2d9293968a6c6844b6c5ff0f6d24a142d2。 :(
    • 我明白了……这仅适用于剧本。所以@udondan 的回答似乎符合你的要求。
    • 在这种情况下使用 default()
    【解决方案2】:

    你可以使用宏。

    {% macro line(key, value) -%}
        {% if not value|none  %}{{ key }} = {{ value }}{% endif %}
    {%- endmacro %}
    

    然后只需为每个键/值对调用宏。

    {{ line('foo_bar', foobar) }}
    {{ line('bar_foo', barfoo) }}
    

    但在极端情况下可能会出现问题。如果未定义foobarbarfoo,它可能会引发错误。在宏中,无论如何都会定义value,因此条件is defined 不再有意义。但是如果 null/none 实际上是任何变量的有效值,那么你就碰壁了……

    有点长,但可能防水:

    {% macro line(key, value) -%}
        {% if value != omit  %}{{ key }} = {{ value }}{% endif %}
    {%- endmacro %}
    
    {{ line('foo_bar', foobar|default(omit)) }}
    {{ line('bar_foo', barfoo|default(omit)) }}
    

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      相关资源
      最近更新 更多