Как настроить приоритет атрибута для group_vars с Ansible - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть файл в моей роли Ansible vars/sonarqube.yml с содержанием

---
lvm_roles:
  sonarqube:
    size: '10g'
    path: '{{ sonar_home }}'

И файл group_vars/all/lvm.yml с содержимым

lvm_roles:
  sonarqube:
    size: '20g'

В ansible.cfg У меня есть строка

hash_behaviour = merge

Без merge результирующий факт будет

lvm_roles:
  sonarqube:
    size: '20g'

Другими словами я теряю path var.

С merge результатомравно

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

Результат, который я хочу и ожидаю, однако,

lvm_roles:
  sonarqube:
    size: '20g'
    path: '/opt/sonarqube'

Итак, желаемое поведение таково, что

  1. Ansible merges vars
  2. config в group_vars имеет преимущество перед config в моей роли.

Можно ли настроить это поведение в Ansible?Как?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Q: "Желаемое поведение таково:

1) Ansible merges vars
2) config in group_vars takes precedence to config in my role.

Можно ли настроить это поведение в Ansible?

A: Нет. Приоритет изменить нельзя. "role vars" (15) переопределить "group_vars" (7). Использовать "group_vars" для переопределения "роли по умолчанию" (2).

Q: То, что вы хотите, это условные переменные по умолчанию, которые Ansible не поддерживает.

A: Если Ansible не будет поддерживать условные значения по умолчанию, то будет невозможно написать роли для нескольких систем. Можно создать условные значения по умолчанию. Пример ниже

# Defaults variables
- name: "al_include_os_vars_playbook_dir: Vars from {{ playbook_dir }}/vars/defaults"
  include_vars: "{{ item }}"
  with_first_found:
    - files:
        - "{{ ansible_distribution }}-{{ ansible_distribution_release }}.yml"
        - "{{ ansible_distribution }}.yml"
        - "{{ ansible_os_family }}.yml"
        - "default.yml"
        - "defaults.yml"
      paths: "{{ playbook_dir }}/vars/defaults"

# Custom variables
- name: "al_include_os_vars_playbook_dir: Vars from {{ playbook_dir }}/vars"
  include_vars: "{{ item }}"
  with_first_found:
    - files:
        - "{{ ansible_distribution }}-{{ ansible_distribution_release }}.yml"
        - "{{ ansible_distribution }}.yml"
        - "{{ ansible_os_family }}.yml"
        - "default.yml"
        - "defaults.yml"
      paths: "{{ playbook_dir }}/vars"


Примечания
  1. Можно включить переменные, специфичные для ОС, после того, как в настройке воспроизведения выяснится, на какой системе выполняется.

  2. Переменные / значения по умолчанию для ролиимеют очень высокий приоритет "include_vars" (18) (из-за 1.). Но этот каталог должен содержать только системные переменные, которые пользователь не хочетo изменить при стандартных обстоятельствах.

  3. При необходимости роль может быть изменена в vars /.Настраиваемые файлы конфигурации в vars / переживут обновление роли, в то время как vars / defaults могут быть обновлены.

  4. Почему кто-то хочет, чтобы это было аппаратно?

Для вашего удобства код доступен на GitHub

0 голосов
/ 27 сентября 2019

Приоритет не настраивается в Ansible, вы не можете дать конфигурации в group_vars более высокий приоритет, чем конфигурация в каталоге vars в роли.

Что вы хотите: условные переменные по умолчанию , которые Ansible не поддерживает.Например, здесь условно задает роль Ansible по умолчанию , а здесь использует условные выражения в vars ansible .

Это область, в которой Ansible определенно отсутствует как инструмент IaC.Это, например, очень часто используемая функция с Chef.Фрагмент из attribute / default.rb из поваренной книги Chef Apache демонстрирует этот общий шаблон

....
case node['platform_family']
when 'rhel', 'fedora', 'amazon'
  if node['platform'] == 'amazon'
    default['apache']['package'] = 'httpd24'
    default['apache']['devel_package'] = 'httpd24-devel'
  else
    default['apache']['package'] = 'httpd'
    default['apache']['devel_package'] = 'httpd-devel'
  end
  default['apache']['service_name'] = 'httpd'
  default['apache']['perl_pkg']    = 'perl'
  default['apache']['apachectl']   = '/usr/sbin/apachectl'
  default['apache']['dir']         = '/etc/httpd'
  default['apache']['log_dir']     = '/var/log/httpd'

Конфигурацию в каталоге vars можно сравнить с атрибутами «override» в Chef.Конфигурация в поваренной книге шеф-повара имеет низкий приоритет, но вы можете использовать атрибуты «переопределить», чтобы дать очень высокий приоритет.Использование атрибутов «переопределить» в кулинарных книгах, однако, очень редко.Они имеют очень ограниченное практическое использование.Наоборот, каталог Ansible vars для его предполагаемое использование для создания конфигурации с высоким приоритетом, которая переопределяет почти все другие конфигурации, имеет очень ограниченное практическое использование.

Если вы не согласны, приведите примеры ролей, в которых нам абсолютно необходима конфигурация с высоким приоритетом для роли.Например, вы можете поделиться ссылкой на роль Ansible, которая демонстрирует практическое использование.

Каталог ролей vars полезен, но не по назначению.На практике каталог используется для хранения условной конфигурации .Тот факт, что конфигурация получает высокий приоритет, является большей проблемой, чем желаемый или намеченный результат.

Это демонстрирует роль geerlingguy.posttgresql .В этой роли geerlingguy использует «псевдопеременные», чтобы обойти тот факт, что Ansible не имеет условных значений по умолчанию.

Например, в vars / Debian-7.yml введена переменная __postgresql_data_dir.Эта переменная имеет высокий приоритет.

__postgresql_data_dir: "/var/lib/postgresql/{{ __postgresql_version }}/main" 

Он не имеет практического применения, кроме того, что его можно использовать для имитации условной переменной по умолчанию postgresql_data_dir, как показано в tasks / variables.yml

- name: Define postgresql_data_dir.
  set_fact:
    postgresql_data_dir: "{{ __postgresql_data_dir }}"
  when: postgresql_data_dir is not defined

Было бы целесообразно настроить правила приоритета, поскольку каталог vars в роли Ansible обычно имеет ограниченное практическое использование из-за его высокого приоритета.Для практического использования хитрости каталога vars требуется, как демонстрирует postgresql_data_dir в роли geerlingguy.posttgresql , чтобы снизить приоритет конфигурации в этом каталоге.

Если вы не используетеВам не понравится этот обман, в качестве альтернативы можно использовать обходной путь set_fact, как описано в Условно установить стандартные роли Ansible или нечестное встроенное кодирование, как описано в , использовать условные выражения в vars ansible .

Сообществу Ansible рекомендуется изменить предполагаемое использование каталога vars с «переопределить» на «условную» конфигурацию.Предоставление высокого приоритета конфигурации в роли является очень редким требованием.Однако условная конфигурация очень и очень распространена.

...