У меня есть два файла переменных 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
и поскольку хеши отвергнутыйне слился.
Определяйте переменные отдельно, используя соглашения об именах и префиксы вместо использования хешей, например:
# playbook/group_vars/all
settings_a: 1
settings_b: 2
# inventory/group_vars/main.yml
settings_c: 3
Наша команда не считает это решение достаточно элегантным.
{{ 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)