В 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
    # ...