Есть ли какие-нибудь переменные, которые Ansible может объединить? - PullRequest
3 голосов
/ 20 сентября 2019

Сегодня я заметил, что Ansible не будет сливать переменные.

Например, когда у меня есть что-то вроде

---
lvm_roles:
  postgresql:
    size: '10g'
    path: '/var/lib/postgresql'

А в другом месте у меня есть, например,

---
lvm_roles:
  sonarqube:
    size: '10g'
    path: '/opt/sonarqube'

Ansible не объединит эти факты.Я не уверен в приоритете, но думаю, что победит первый.Без ошибок или предупреждений.ИМХО опасная функция для инструмента управления конфигурацией.

Существуют ли какие-либо переменные, которые Ansible может объединить?Списки и хэш не будут работать.Есть ли какой-то обходной путь для этого?

Это существенный недостаток Ansible.Потому что «факты» могут зависеть от того, что вы предоставляете.Невозможность объединить «факты» делает необходимым жесткий код и дублирование того, что вы не хотите настраивать.

Например, когда я создаю один файл с

lvm_roles:
  postgresql:
    size: '10g'
    path: '{{ postgresql_home }}'
  sonarqube:
    size: '10g'
    path: '{{ sonar_home }}'

Это не будет работать, потому что sonar_home не определен на узле de postgresql.На узле sonarqube postgresql_home не определено.Способность гибко использовать переменные сильно ухудшается, если объединение невозможно.

1 Ответ

3 голосов
/ 20 сентября 2019

Извлечение файла по умолчанию ansible.cfg файла :

# if inventory variables overlap, does the higher precedence one win
# or are hash values merged together?  The default is 'replace' but
# this can also be set to 'merge'.
#hash_behaviour = replace

Поэтому вы можете изменить это поведение, установив hash_behaviour = merge.

Я бы не стал это менятьна общесистемной основе, поскольку это может нарушить другие проекты / роли, которые будут полагаться на поведение по умолчанию.Вы можете распространять ansible.cfg в корне вашего конкретного проекта, который действительно нуждается в этом.

Между тем, как указал @dgw на конкретном примере, я всегда был в состоянии сохранить поведение по умолчанию, тщательновыбрать место для размещения моих переменных (группа или хост в инвентаре, включенный файл, книга воспроизведения ...) и, в случае необходимости, объединить их самостоятельно.

...