我需要动态生成一个字典并将其分配给 Ansible var,以便每个主机都可以使用相同的数据,并且不需要在每个主机上重新生成。这将由任务和模板循环。可以通过将 Jinja 嵌套在 var 定义中来构建列表,如下所示:
var_list: >
[
{% set data = [] %}
{% for host in groups['all'] %}
{{ data.append(host) }}
{% endfor %}
{{ data }}
]
但是,我无法使用听写来做到这一点:
var_dict: >
{
{% set data = dict() %}
{% for host in groups['all'] %}
{{ data | combine({host: []}) }}
{% endfor %}
{{ data }}
}
这会产生一个巨大的乱码字符串:{u'host.subdom.dom.tld': []} {}
...
我期望的是一个 var 设置为一个真正的 dict 对象,该对象可以单独引用其组件(如 {{ var_dict.host1[0] }}
),其结构类似于以下 JSON:
{
"host1": [],
"host2": []
}
有没有办法在分配给变量时使其扩展为正确的字典?或者是否有另一种方法可以在没有 awful set_fact
hackery 的情况下从循环生成字典?
最佳答案
您的两个模板都已损坏(第一个模板生成嵌套列表,第二个模板使用此表达式循环打印数据{{ data | merge({host: []}) }}
, data
的值在结束之前保持为空)。
Jinja2 是一个模板引擎,您实际上不需要创建数据结构来稍后打印它们。您可以直接形成输出。
对于列表:
var_list: >
[ {% for host in groups['all'] %}'{{ host }}',{% endfor %} ]
对于字典:
var_dict: >
{ {% for host in groups['all'] %}'{{ host }}': [],{% endfor %} }
当您期望 Ansible 解释这些值时,您不需要注意尾随的逗号,否则会出现 loop.last .
关于ansible - 如何在 Jinja/Ansible 中生成一个 dict 作为 var?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51775141/