【问题标题】:Ansible/Jinja templatingAnsible/Jinja 模板
【发布时间】:2020-06-21 15:02:19
【问题描述】:

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

【问题讨论】:

    标签: ansible jinja2


    【解决方案1】:

    { "{{ item }}" : ['some string value'] } 部分创建一个具有相同键 "{{ item }}" 作为文字字符串的字典,而不是循环中每个项目的变量。因此,combine 每次都会用最新的对覆盖字典 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
    

    或者,简单地说

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

    Ansible 还建议尽可能使用 loop 而不是 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'] }
    

    【讨论】:

      【解决方案2】:

      过滤器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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2020-02-13
        相关资源
        最近更新 更多