Назад | Перейти на главную страницу

Как объединить переменные типа hash в разных файлах переменных в недоступном?

У меня есть два файла переменных YAML, которые повторно используются для многих пьес:

# playbook/group_vars/all

settings:
  a: 1
  b: 2

# inventory/group_vars/main.yml

settings:
  c: 3

я хочу settings быть равным { a: 1, b: 2, c: 3 } в моих пьесах.

Вместо этого он равен { c: 3 } так как inventory/group_vars/* имеет более высокий приоритет, чем playbook/group_vars/all и поскольку хеши отвергнутыйне слился.

Я вижу следующие варианты:

Наша команда не считает это решение достаточно элегантным.

{{ list_common + list_specific }}

Это требует изменений во многих сценариях (у нас их много), а также выглядит плохо.

-

Есть ли другие варианты объединения хэшей из разных файлов вместо их переопределения (переопределения)?

Чего мы пытаемся достичь, так это прекратить дублирование списков в файлах переменных и определить только те параметры, которые относятся к группе / хосту.

Прежде всего, список [1, 2, 3] а ты говоришь о словаре {a:1, b:2, c:3} или другими словами хеш.

Есть настраиваемый параметр: hash_behaviour.

По умолчанию это replace, но вы можете установить его на merge для достижения желаемого поведения.

Начиная с Ansible v2.0 это можно сделать:

- name: merging hash_a and hash_b into hash_c
  set_fact: hash_c="{{ hash_a|combine(hash_b) }}"

Узнайте больше под Ansible фильтры - объединение хэшей / словарей (исходящий от Jinja2)