在Jinja2中使用raw / endraw不能按预期工作,因为Ansible中的模板是递归评估的。
https://docs.ansible.com/ansible/latest/modules/template_module.html#notes
“最后更新于2019年8月15日”。适用于Ansible 2.8。
文档“递归评估”是什么意思?听起来很吓人。这些影响是特定于{% raw %}
/ {% endraw %}
还是其他影响?
答案 0 :(得分:0)
只要模板可以求值,它们就会递归求值以允许变量嵌套。
结果,如果模板更改,它将继续进行。
我认为我们只需要对此进行记录,而不建议原始/绘制。
-Comment on issue #4638, "Using {% raw %} in templates does not stop jinja2 variable substitution"
这似乎已经有所改变。如果我尝试在Ansible 2.8上的链接问题中运行复制器,则按预期进行原始/绘制工作。
我在文档#61233 Template action does not recursively evaluate variables any more中将其报告为错误。事实证明:
这里的情况很复杂,[您的报告所谈论的]是“模板”操作,而不是“模板中的模板”,这在处理方式上有所不同,但是该操作的行为似乎有所变化。 / p>
在某种意义上,我可以看到“ ansible中的模板”是递归评估的(Ansible 2.8.4):
$ ansible -m debug localhost -a msg='{{ a }}' -e 'a={{ b }}' -e 'b={{ a }}'
localhost | FAILED! => {
"msg": "An unhandled exception occurred while templating '{{ b }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while templating '{{ a }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while templating '{{ b }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message:
... An unhandled exception occurred while templating '{{ b }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while templating '{{ a }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: recursive loop detected in template string: {{ a }}"
因此,这看起来与命令式编程语言(例如Python或Javascript)不同。
我担心的是,这是通过重新模板化输出字符串来实现的,直到它不包含{{
。这将是对带内信令的可怕使用。
据我所知道的当前使用的版本,事实并非如此。即现在,Ansible似乎可以正确实现lazy evaluation模型。
$ ansible -m debug localhost -a msg='{{ a }}' -e 'a={{ "{{ 1 }}" }}'
localhost | SUCCESS => {
"msg": "{{ 1 }}"
}