How to trigger a custom error from inside a Jinja template?
Solution 1
Answer from the comment:
There is no easy way to accomplish this – only via custom plugin. For details see: https://stackoverflow.com/questions/21778252/how-to-raise-an-exception-in-a-jinja2-macro
Solution 2
Ansible adds the mandatory filter to Jinja, which can be used to do this:
{{ ('OK text' if condition_ok) | mandatory('Text of error message') }}
gives the failure:
fatal: [hostname]: FAILED! => {"msg": "Text of error message"}
(Replace condition_ok
with the check that you need to make; 'OK text'
can be just ''
if nothing should be substituted.)
Solution 3
I have written a jinja2 extension-jinja2_error to raise error.
Firstly,
pip install jinja2_error
If you use it with ansible
ANSIBLE_JINJA2_EXTENSIONS=jinja2_error.ErrorExtension ansible-playbook site.yml -v
If you use it with jinja2 Environment
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"})
If you want to know the details, please access
https://github.com/mumubin/jiaja2_error
Related videos on Youtube
Mikhail T.
Updated on September 18, 2022Comments
-
Mikhail T. over 1 year
Though Ansible itself has a way for triggering a custom error, I can not find anything similar for Jinja.
My current method uses a syntax error:
{% 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 %}
but those are rendered poorly at run-time -- one needs to look inside the template-file and search for the error (the rendering does not even include the line-number!).
Is there a way to output a neat failure message from inside Jinja-template?
-
lost over 2 yearsDidn't work for me, and looking at the source it actually checks that the thing passed in is undefined, not just false-y.