每当我尝试让 Ansible 解释嵌套变量(即另一个变量中的变量)时,我都无法获得预期的结果。
给定变量:
key: bar
foo:
bar: baz
foo_bar: baz
我尝试过这三种方法,但动态访问密钥的运气不佳bar
字典的foo
或钥匙foo_bar
,当根据以下值构建时key
:
-
- ansible.builtin.debug:
msg: "{{ foo[{{ key }}] }}"
但是,我收到错误:
'模板化字符串时出现模板错误:预期标记'':'',得到''}''。字符串:{{ foo[{{ key }}] }}'
-
- ansible.builtin.debug:
msg: "{{ foo_{{ key }} }}"
但是,我遇到了类似的错误
'模板化字符串时出现模板错误:预期标记''打印语句结束'',得到''{''。字符串:{{ foo_{{ key }} }}'
-
- ansible.builtin.debug:
msg: "{{ foo['{{ key }}'] }}"
在这里,我得到了错误
该任务包含一个带有未定义变量的选项。错误是:“dict object”没有属性“{{ key }}”
我期望得到的值foo.bar
or foo_bar
, so baz
.
实现这一目标的正确方法是什么?
正如建议的经常问的问题安西布尔的,小胡子不堆叠.
另一个规则是“胡须不能堆叠”。我们经常看到这样的情况:
{{ somevar_{{other_var}} }}
上面的内容并不像您期望的那样工作,如果您需要使用动态变量,请酌情使用以下内容:
{{ hostvars[inventory_hostname]['somevar_' ~ other_var] }}
对于“非主机变量”,您可以使用变量查找 plugin:
{{ lookup('vars', 'somevar_' ~ other_var) }}
Source: https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#when-should-i-use-also-how-to-interpolate-variables-or-dynamic-variable-names
因此,有两种情况适用:
-
当尝试从变量访问字典的键时,您只需按原样使用该变量,请记住,当您在变量内部时表达式分隔符{{ ... }},如果没有用单引号或双引号括起来,字符串将被解释为变量。
- ansible.builtin.debug:
msg: "{{ foo[key] }}"
vars:
key: bar
foo:
bar: baz
-
当尝试从变量构造变量的名称或字典的键时,您必须使用串联运算符,~:
- ansible.builtin.debug:
msg: "{{ foo['foo_' ~ key] }}"
vars:
key: bar
foo:
foo_bar: baz
您可能还需要使用vars lookup访问动态变量:
- ansible.builtin.debug:
msg: "{{ lookup('vars', 'foo_' ~ key) }}"
vars:
key: bar
foo_bar: baz
旁注:
-
请使用vars
抬头 -lookup('vars', 'somevar_' ~ other_var)
— and not the vars
字典—vars['somevar_' ~ other_var]
, as 它从来没有打算成为 Ansible 的一个功能 and 将在未来版本中删除
历史短暂,vars
是以前使用它将变量传递给模板的代码的剩余部分,它从未打算供外部使用,并且大多数时候没有模板化任何内容。
不相关的更改允许它“有时”模板化,但这从来不是故意的,它没有被删除的唯一原因是因为有些人依赖它,这是通过查看代码和/或其他已经使用它的人发现的。尽管我们长期以来一直打算弃用和删除vars
构造,缺乏触发运行时消息的好方法使我们无法这样做。
我们通过查找创建了 2 个替代方案varnames
and vars
,它可能不像字典那么灵活,但也不会因为不需要的访问而占用内存,因为大多数用户只想匹配现有变量的一小部分。
Source: https://github.com/ansible/ansible/issues/74904#issuecomment-854137949
-
更建议使用正确的串联运算符,~
比数学运算符+
正如 Ansible 文档中所建议的,原因是 Jinja 文档中提出的:
通常对象是数字,但如果两者都是字符串或列表,则可以通过这种方式连接它们。然而,这不是连接字符串的首选方式!对于字符串连接,请查看~
操作员。
Source: https://jinja.palletsprojects.com/en/2.11.x/templates/#math
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)