Хотя сам 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"})
Если вы хотите узнать подробности, перейдите по ссылке