如何评估Ansible模板? “递归评估”是什么意思?

时间:2019-08-23 13:11:46

标签: ansible escaping

  

在Jinja2中使用raw / endraw不能按预期工作,因为Ansible中的模板是递归评估的。

     

https://docs.ansible.com/ansible/latest/modules/template_module.html#notes
“最后更新于2019年8月15日”。适用于Ansible 2.8。

文档“递归评估”是什么意思?听起来很吓人。这些影响是特定于{% raw %} / {% endraw %}还是其他影响?

1 个答案:

答案 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 }}"
}