В Ansible, как объединить переменные из отдельных файлов в один массив?
в Ansible, в роли, у меня есть файлы vars, такие как:
vars/
app1.yml
app2.yml
каждый файл содержит vars, специфичные для приложения / веб-сайта, как это:
name: app1
git_repo: https://github.com/philgyford/app1.git
# ...
В идеале, без задачи, заранее зная, какие приложения имеют переменные файлы, я хотел бы в конечном итоге с массивом под названием apps
такой:
apps:
- name: app1
git_repo: https://github.com/philgyford/app1.git
# ...
- name: app2
git_repo: https://github.com/philgyford/app2.git
# ...
ie, который объединяет переменные из файлов в один.
Я знаю, что могу загрузить все переменные файлы, такие как это:
- name: Load var files
with_fileglob:
- ../vars/*.yml
include_vars: '{{ item }}'
но, учитывая, что каждый файл имеет одинаковые имена переменных, он перезапишет каждый предыдущий набор переменных. Я не вижу способа загрузить переменные и поместить их в apps
массив.
Я открыт для небольшой перестановки вещей, если это единственный способ сделать что-то подобное возможным.
2 ответов
вы не можете сделать это. Переменные всегда будут переопределять переменные с одинаковым именем. Единственное, что вы можете сделать с этой точной настройкой, это напишите свой собственный плагин vars, который читает эти файлы и объединяет их в массив.
если вы открыты для изменения структуры определения приложений, вы можете использовать хэш и задание hash_behavior=merge
. В каждом файле vars у вас будет такое определение, как:
apps:
app1:
git_repo: https://github.com/philgyford/app1.git
apps:
app2:
git_repo: https://github.com/philgyford/app2.git
Когда Анзибль загружает оба файла, которые он автоматически объединит в:
apps:
app1:
git_repo: https://github.com/philgyford/app1.git
app2:
git_repo: https://github.com/philgyford/app2.git</pre>
но имейте в виду, что hash_behavior=merge
фундаментально изменяет поведение Ansible по умолчанию на глобальном уровне. Убедитесь, что все ваши роли не имеют проблем с этим параметром. В документации упоминается:
мы обычно не рекомендуем использовать этот параметр, если вы не считаете, что у вас есть абсолютная потребность в нем
если вы все еще используете Ansible 1, Вы можете использовать один из моих старых плагинов вместо этого: include_vars_merged. В основном это добавляет поведение hash_behavior=merge
только для одной задачи.
я еще не рассматривал миграцию этого на Ansible 2, хотя и в настоящее время похоже, что у меня больше не будет необходимости в этом.
С Ansible 2.2
, the include_vars
(ссылке модуль) был расширен и совсем немного.
теперь можно сделать что-то вроде:
- include_vars:
name: 'apps'
dir: '../vars'
extensions:
- 'yaml'
- 'yml'
name
- ключ есть. На странице модуля:
имя переменной, в которую назначаются включенные vars. Если опущено (null), они будут сделаны vars верхнего уровня.
это позволяет преобразовать:
vars/
app1.yml
app2.yml
...
приложения app1.в формате YML:
- name: app1
git_repo: https://github.com/philgyford/app1.git
# ...
приложения app2.в формате YML:
- name: app2
git_repo: https://github.com/philgyford/app2.git
# ...
што...
apps:
- name: app1
git_repo: https://github.com/philgyford/app1.git
# ...
- name: app2
git_repo: https://github.com/philgyford/app2.git
# ...