首页 > 解决方案 > Ansible/Jinja 模板

问题描述

我正在寻找一个事实,其成分是字典,但在下面的代码中my_dict_var

呈现为string虽然我希望它是一本字典。

- set_fact:
    my_fact: "{{ my_fact | default({}) | combine( my_dcit_var ) }}"
  vars:
    my_dcit_var: { "{{ item }}" : ['some string value'] }
  with_items:
    - 1
    - 2
    - 3

我期待最终的结果应该是。 {1: ['some string value'], 2: ['some string value'], 3: ['some string value']} 有人可以指出我的错误。

标签: ansiblejinja2

解决方案


该部分为循环中的每个项目{ "{{ item }}" : ['some string value'] }创建一个具有相同键的字典,"{{ item }}"而不是一个变量。key:value因此,combine每次都会用最新的对覆盖 dict对。这是您可以解决的方法,

- set_fact:
    my_fact: "{{ my_fact | default({}) | combine( my_dict_var ) }}"
  vars:
    my_dict_var: "{{ { item : ['some string value'] } }}"
  with_items:
    - 1
    - 2
    - 3

或者,简单地说

- set_fact:
    my_fact: "{{ my_fact | default({}) | combine( { item: ['some string value'] } ) }}"
  with_items:
    - 1
    - 2
    - 3

Ansible 还建议尽可能使用 ofloop而不是with_查找。这是一个使用循环和指定键:值对的示例。

- set_fact:
    my_fact: "{{ my_fact | default({}) | combine( { item.key: item.val } ) }}"
  loop:
    - { key: 1, val: ['some string value1'] }
    - { key: 2, val: ['some string value2'] }
    - { key: 3, val: ['some string value3'] }

推荐阅读