Как вызвать пользовательскую ошибку из шаблона 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-шаблона?

4 ответа

Решение

Ответ из комментария:

Нет простого способа сделать это - только с помощью специального плагина. Для получения дополнительной информации см.: https://stackoverflow.com/questions/21778252/how-to-raise-an-exception-in-a-jinja2-macro

Ansible добавляет в Jinja обязательный фильтр, который можно использовать для этого:

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

дает сбой:

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

(Заменить condition_ok с чеком, который вам нужно сделать; 'OK text' может быть просто '' если ничего не следует заменять.)

Я написал расширение jinja2 - jinja2_error, чтобы вызвать ошибку.

Во-первых,

pip install jinja2_error

Если вы используете его с анзиблем

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

Если вы используете его с 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"})

Если вы хотите узнать подробности, перейдите на

https://github.com/mumubin/jiaja2_error

Для тех, кто ищет обязательный фильтр, но не использует ansible

      {%- if not param.columns %} 
{# use 'include' wrong way, so it raise a error #}
{% include "required 'params.columns' not found!" %}
{%- endif %}
Другие вопросы по тегам