尽管 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"})
欲了解详情,请访问
答案4
对于那些寻找强制过滤器但不使用 ansible 的人来说
{%- if not param.columns %}
{# use 'include' wrong way, so it raise a error #}
{% include "required 'params.columns' not found!" %}
{%- endif %}