Шаблоны Ansible / Jinja - PullRequest
0 голосов
/ 21 июня 2020

Я хочу установить факт, составной частью которого является словарь, но в приведенном ниже коде 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 ]

3 голосов
/ 21 июня 2020

Часть { "{{ item }}" : ['some string value'] } создает словарь с тем же ключом "{{ item }}", что и буквальная строка вместо переменной для каждого элемента в l oop. Таким образом, comb каждый раз перезаписывает пару dict 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_ поиска, где это возможно. Вот пример использования l oop и указанных пар ключ: значение.

- 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'] }
0 голосов
/ 21 июня 2020

Фильтр dict служит для создания словаря из списка пар ключ-значение. Воспользуемся фильтром продукт для создания списка. Например,

    - 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
...