Страницы

Поиск по вопросам

четверг, 2 апреля 2020 г.

Динамическое добавление вложенных переменных в существующую структуру переменных

#ansible

                    
Есть структура вида в котором хранятся объекты со своими какими-то свойствами, которые
прописаны в файле определения переменных:

vars:
  objects:
    - name: objectA:
      sectionB:
        property1: "value1"
        property2: "value2"
        property3: "value3"


Хотел бы динамически во время исполнения моего playbook исполнять task, который добавлял
бы в данный(ые) объект(ы) дополнительное динамически вычисляемое свойство.

Нашел много примеров, которые динамически добавляют элементы (items) в словарь (dictionary),
но вот подобного найти не получается.

Требуется сделать нечто подобное (один из вариантов, которые я пробовал использовать):

- set_fact:
    item.sectionB: "{{item.sectionB | combine(property_string) }}"
  with_items:
    - "{{ objects }}"
  vars:
    property_string: '{ property4: "value4" }'


Чтобы получить в итоге:

vars:
  objects:
    - name: objectA:
      sectionB:
        property1: value1
        property2: value2
        property3: value3
        property4: value4


Пробовал использовать функцию combine(), она в таком виде отрабатывает без ошибок,
но структуру не изменяет, а функция union() завершается ошибкой.
    


Ответы

Ответ 1



Вот здесь описан принцип решения: https://ansibledaily.com/process-complex-variables-with-set_fact-and-with_items/ Изменить изначальную переменную нельзя, но можно при помощи set_fact сделать факт с таким же именем, который в большинстве случаев будет меть приоритет к изначальной переменной. Первым шагом формируете новый список объектов с добавлением к элементам нужных атрибутов через combine. Примерно: - set_fact: tmp_object: "{{ item | combine(<объет_с_дополнениям>) }}" with_items: "{{ objects }}" register: tmp_objects И потом из tmp_objects достаем то, что нам на самом деле нужно: - set_fact: objects: {{ tmp_objects.results | map(attribute='ansible_facts.tmp_object') | list }}"

Комментариев нет:

Отправить комментарий