5

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?

2
3

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

1

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

1

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.)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.