ansible - 如何在 Jinja/Ansible 中生成一个 dict 作为 var?

标签 ansible jinja2

我需要动态生成一个字典并将其分配给 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/

相关文章:

kubernetes - Ansible - 迭代项目并在值不存在时执行任务

python - 使用 Jinja2 模板访问嵌套字典

python - Jinja2 模板的整洁

list - Ansible - 如果用户已经在其他组中,则从组 x 中删除用户

python - Action 插件和 Ansible 模块之间有什么关系?

python - 相当于 Jinja2 中的 list(d.items())[0]

python - 如何以 wtf flask 形式发送隐藏字段以进行数据库插入

python - Flask(使用 jinja2)可以使用 'windows-1251' 编码渲染模板吗?

python - Ansible的模板模块在哪里?

java - 如何使用 Ansible Playbook 检查目标机器中安装的不同 JAVA?