Ansible / Jinja模板

时间:2020-06-20 22:25:51

标签: ansible jinja2

我希望设置一个事实,其成分为字典,但在下面的代码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']} 有人可以指出我的错误。

2 个答案:

答案 0 :(得分:3)

部分getServerSideProps使用与文本字符串相同的键{ "{{ item }}" : ['some string value'] }创建一个字典,而不是循环中每个项目的变量。因此,每次都会用最新的对覆盖dict "{{ item }}"对。这是解决方法,

key:value

或者简单地

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

Ansible还建议尽可能使用- set_fact: my_fact: "{{ my_fact | default({}) | combine( { item: ['some string value'] } ) }}" with_items: - 1 - 2 - 3 而不是loop查找。这是一个使用循环和指定的key:value对的示例。

with_

答案 1 :(得分:0)

过滤器dict的作用是根据键值对列表创建字典。让我们使用过滤器product创建列表。例如

    - set_fact:
        my_fact: "{{ dict(list1|product(list2)) }}"
      vars:
        list1:
          - 1
          - 2
          - 3
        list2:
          - ['some string value']
    - debug:
        var: my_fact
    - debug:
        msg: "{{ my_fact|to_json }}"

给出预期的结果

  my_fact:
    1:
    - some string value
    2:
    - some string value
    3:
    - some string value

  msg: '{"1": ["some string value"], "2": ["some string value"], "3": ["some string value"]}'

以下是如何使用过滤器zip从两个列表创建字典的示例。例如

    - set_fact:
        my_fact: "{{ dict(list1|zip(list2)) }}"
      vars:
        list1:
          - 1
          - 2
          - 3
        list2:
          - [value-1a, value-1b, value-1c]
          - [value-2a, value-2b, value-2c]
          - [value-3a, value-3b, value-3c]
    - debug:
        var: my_fact

给予

  my_fact:
    1:
    - value-1a
    - value-1b
    - value-1c
    2:
    - value-2a
    - value-2b
    - value-2c
    3:
    - value-3a
    - value-3b
    - value-3c