Назад | Перейти на главную страницу

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

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

Нет простого способа сделать это - только с помощью специального плагина. Подробнее см .: 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