ansible - 如何评估 Ansible 模板?它们被“递归评估”是什么意思?
问题描述
在 Jinja2 中使用 raw/endraw 不会像您期望的那样工作,因为 Ansible 中的模板是递归评估的。
https://docs.ansible.com/ansible/latest/modules/template_module.html#notes
“最后更新于 2019 年 8 月 15 日”。适用于 Ansible 2.8。
“递归评估”的文档是什么意思?听起来很吓人。是特定于{% raw %}
/的含义{% endraw %}
,还是有其他含义?
解决方案
只要模板将评估,它们就会递归评估以允许变量嵌套。
因此,如果模板发生更改,它将继续运行。
我认为我们只需要记录这一点,而不是建议 raw/endraw。
这似乎在某些时候发生了变化。如果我尝试在 Ansible 2.8 上的链接问题中运行复制器,原始/绘制按预期工作。
我在文档中将此报告为错误:#61233 模板操作不再递归评估变量。事实证明:
这里的情况好坏参半,[您的报告正在谈论]“模板”操作,而不是“ansible 中的模板”,这在处理方式上有所不同,但该操作似乎确实发生了行为变化。
我可以看到“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 现在似乎正确地实现了惰性评估模型。
$ ansible -m debug localhost -a msg='{{ a }}' -e 'a={{ "{{ 1 }}" }}'
localhost | SUCCESS => {
"msg": "{{ 1 }}"
}
推荐阅读
- sql - 用于计算总和的 SQL Server 查询
- zpl - 皇家邮政 CMDM 条码
- elasticsearch - elasticsearch 错误或缺失查询
- google-sheets - 返回所有 DEC YYYY 和结果的 Google 表格公式?
- javascript - 是否有可能将 async/await 与 map 一起使用,
- google-cloud-platform - 如何检查是否为 GCP 中每个密钥环中的每个密钥启用了密钥轮换?
- airflow - 使用微风无法使用气流2.0.0 构建 docker 映像
- pyspark - 使用 PySpark 读取带有多行字符串且不带引号的平面文件
- google-sheets - 使用 Google 表格上的 URL 选项卡的 ImportXML / ImportHTML 解决方法
- php - 我想显示较大的数字变量,但它没有在页面中显示任何内容