Ансибельные фильтры (ipaddr) в Python

#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 , а затем действуйте, как описано выше. Если у вас есть еще вопросы по этой теме, пожалуйста, откройте новый вопрос.