如何使用ansible中的jinja2过滤器?

问题描述 投票:0回答:2

我正在使用jinjia2编程。我想使用很多来自 ansible 的 jinjia2 过滤器,例如

version_compare
。有没有办法导入ansible的过滤器?

是否有任何扩展包含类似于 ansible 的

version_compare
过滤器的过滤器?

python jinja2
2个回答
1
投票

在您的环境中安装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)

0
投票

首先,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'"
}

相反,Ansible 将

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
© www.soinside.com 2019 - 2024. All rights reserved.