如何从 Jinja 模板内部触发自定义错误?

如何从 Jinja 模板内部触发自定义错误?

尽管 Ansible 本身触发自定义错误的方法,我找不到任何与 Jinja 类似的东西。

我目前的方法是使用句法错误:

{%  if 'ansible_mounts' in hostvars[host] %}
# {{ host }} knows its mount-points
{% else %}
# {% error!! No ansible_mounts listed for host - fact-gathering must've failed %}
{% endif %}

但是这些在运行时呈现效果很差——需要查看模板文件内部并搜索错误(呈现甚至不包括行号!)。

有没有办法从 Jinja-template 内部输出简洁的失败消息?

答案1

评论中的答案:

没有简单的方法可以实现这一点 - 只能通过自定义插件。有关详细信息,请参阅:https://stackoverflow.com/questions/21778252/how-to-raise-an-exception-in-a-jinja2-macro

答案2

Ansible 添加了强制的过滤器到 Jinja,可用于执行以下操作:

{{ ('OK text' if condition_ok) | mandatory('Text of error message') }}

给出失败:

fatal: [hostname]: FAILED! => {"msg": "Text of error message"}

condition_ok用您需要进行的检查进行替换;如果没有需要替换的检查'OK text',则可以。)''

答案3

我已经编写了一个 jinja2 扩展-jinja2_错误引发错误。

首先,

pip install jinja2_error

如果你将它与 ansible 一起使用

ANSIBLE_JINJA2_EXTENSIONS=jinja2_error.ErrorExtension ansible-playbook site.yml -v

如果你与 jinja2 环境一起使用

    from jinja2 import Environment

    from jinja2_error import jinja2_error

    if __name__ == '__main__':
        env = Environment(extensions=[jinja2_error.ErrorExtension])
        render_text = """
                {% if 1==1 %}
                  {% error "It's error" %}
                {% endif %}
                """
        template = env.from_string(render_text)
        result = template.render({"a": "b"})

欲了解详情,请访问

https://github.com/mumubin/jiaja2_error

答案4

对于那些寻找强制过滤器但不使用 ansible 的人来说

{%- if not param.columns %} 
{# use 'include' wrong way, so it raise a error #}
{% include "required 'params.columns' not found!" %}
{%- endif %}

相关内容