Используйте ansible jinja2 объединить фильтр в цикле - PullRequest
0 голосов
/ 07 марта 2020

Я получил эту простую книгу, в которой я пытаюсь создать словарь из списка пар ключ / значение, используя фильтр combine. Проблема в том, что он не работает при цикле по парам (я пробовал l oop, with_dict, with_items).

- name: test jinja2 combine filter
  hosts: localhost    
    - name: test combine
      vars:
        x: {'three', 3}
      set_fact:
        x: "{{ x | combine(item) }}"
      with_items: [{'one': 1},{'two': 2}]

    # I am expecting to see the two new dicts here,
    # but only the last one in the list is added
    - name: print x
      debug: msg={{ x }}

Ожидаемый результат:

ok: [localhost] => {
    "msg": {
        "three": 3,
        "one": 1,
        "two": 2
    }
}

Мой результат:

ok: [localhost] => {
    "msg": {
        "three": 3, 
        "two": 2
    }
}

Начиная с этого сообщения, кажется, что не существует готового решения для такого рода проблемы. Хотя написать собственный плагин не составит труда, мне все еще интересно, есть ли стандартное решение без написания плагина.

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Итак, плохая новость в том, что я не могу реплицировать ваш опыт локально с ansible 2.9 (так что возможно, вы испытываете поведение, которое они решили как ошибку и исправили), но моя гипотеза состоит в том, что поведение with_items: повторно выполняет оператор vars: как побочный эффект l oop, таким образом сбрасывая x через каждый l oop, что эквивалентно: with_items({vars, set_fact}, [{item},{item}]) вместо {vars, with_items(set_fact, ...)}

сказал, что, если ваша реальная ситуация не помешает этому, вы действительно хотите не повторять set_fact, а запускать set_fact для комбинированных элементов:

- set_fact:
    x: '{{ x | combine(*new_values) }}'
  vars:
    x: {"three": 3}
    new_values: [{"one": 1}, {"two": 2}]

- debug: var=x
0 голосов
/ 07 марта 2020

попробуйте ansible-playbook -c local <file.yaml

- hosts: localhost
  tasks:
    - name: test combine
      vars:
        x: {'three': 3}
      set_fact:
        x: "{{ x | combine(item) }}"
      with_items: [{'one': 1},{'two': 2}]

    # I am expecting to see the two hashes here...
    # but only the last one in the list is added
    - name: print x
      debug: msg={{ x }}
...