#python #ansible #jinja2
Вопрос:
Я пытаюсь использовать фильтр ansible (ipaddr) в python.
from ansible.plugins.filter import ipaddr
import jinja2
env = jinja2.Environment()
tmpl_string = """test : {{ '10.124.0.0'| ipaddr(-1) }}"""
tmpl = env.from_string(tmpl_string)
print(tmpl.render())
Я могу импортировать фильтр ipaddr без каких-либо проблем, но при выполнении кода я получаю следующую ошибку:
jinja2.exceptions.TemplateAssertionError: No filter named 'ipaddr'.
Ответ №1:
Вам необходимо зарегистрировать фильтр в Jinja, чтобы сделать его доступным в шаблонах; см. раздел Пользовательские фильтры документации. Ты хочешь:
from ansible.plugins.filter import ipaddr
import jinja2
env = jinja2.Environment()
# tell jinja about the ipaddr filter
env.filters['ipaddr'] = ipaddr
tmpl_string = """test : {{ '10.124.0.0'| ipaddr(-1) }}"""
tmpl = env.from_string(tmpl_string)
print(tmpl.render())
Комментарии:
1. (Также обратите внимание, что
netaddr
дляipaddr
правильной работы фильтра вам необходимо установить модуль.)2. ответ правильный. Но обратите внимание, что с более поздними версиями Ansible вам нужно импортировать ipaddr следующим образом: « из ansible_collections.ansible.netcommon.plugins. фильтр.ipaddr импорт ipaddr «
3. Как можно было бы добавить фильтр b64encode, используя тот же синтаксис? Я не могу найти соответствующую коллекцию в форме <из ansible_collections.ansible….. импорт……………. >
4. Ansible
b64encode
включает иb64decode
фильтрует по умолчанию.from ansible.plugins.filter.core import b64encode
, а затем действуйте, как описано выше. Если у вас есть еще вопросы по этой теме, пожалуйста, откройте новый вопрос.