我正在使用jinjia2编程。我想使用很多来自 ansible 的 jinjia2 过滤器,例如
version_compare
。有没有办法导入ansible的过滤器?
是否有任何扩展包含类似于 ansible 的
version_compare
过滤器的过滤器?
在您的环境中安装ansible,导入过滤器并在jinja2环境中注册。
from ansible.plugins.test.core import version_compare
from jinja2 import Environment
env = Environment()
env.filters['version_compare'] = version_compare
template = env.from_string("{{ version|version_compare('2.0', 'ge') }}")
result = template.render(version="1.9")
print(result)
首先,Ansible 不会将
version_compare
注册为 Jinja2 filter。
示例:
$ ansible -m debug -i localhost, -c local all -a 'msg={{ "1.9" | version_compare("2.0", "ge") }}'
localhost | FAILED! => {
"msg": "template error while templating string: Could not load \"version_compare\": 'version_compare'. String: {{ \"1.9\" | version_compare(\"2.0\", \"ge\") }}. Could not load \"version_compare\": 'version_compare'"
}
version_compare
作为 测试 添加到其 Jira2 环境中。
您可以像这样导入并注册(核心)Ansible 过滤器(和测试):
import ansible.plugins.filter.core
import ansible.plugins.test.core
import jinja2
e = jinja2.Environment()
e.filters.update(ansible.plugins.filter.core.FilterModule().filters())
e.tests.update(ansible.plugins.test.core.TestModule().tests())
使用示例:
t = e.from_string('{{ ["2.0", "1.3", "2.3"] | select("version", "2.0", "ge")'
' | join(",") }}')
print(t.render())
产量:
'2.0,2.3'
注意:
version_compare
只是 version
的别名
或者:
t = e.from_string('{{ s | sha1 }}')
print(t.render(s='Hello World'))
产量:
0a4d55a8d778e5022fab701977c5d840bbc486d0