Назад | Перейти на главную страницу

Возможные списки слияния множества совпадающих group_vars

У нас много групп серверов, например:

Каждая группа серверов имеет свои собственные задания cron, и сервер может принадлежать многим совпадающим и несовпадающим группам (сервер может быть во всех группах MTL, DMZ, APP, CUSTOMER_Y и CUSTOMER_X).

Что мы хотим сделать, так это объединить весь список "cron_jobs" совпадающих переменных group_vars данного сервера.

Это возможно ? Иначе, есть ли способ достичь эквивалента?

Конечно, мы могли:

crons: "{{ all_crons + dmz_crons + mtl_crons }}" # etc ..

Но это было бы жлобом, учитывая, что у нас сотни групп

Спасибо большое за помощь

Создайте роль для каждой функции (OTA, MTL, DMZ, APP, CUSTOMER_X, CUSTOMER_Y)

- hosts: dmz
  roles:
    - { role: dmz}   
- hosts: ota
  become: yes
  roles:
    - { role: ota}       
- hosts: app
  become: yes
  roles:
    - { role: app}   

Каждая роль выполняет определенную конфигурацию для функции (т.е. dmz настраивает dmz), а также добавляет необходимые задания cron.

Вы можете оптимизировать роли, избегая повторения кода, используя общую роль, которая добавляется как зависимость от метапапки.

Пример, в роли app папка metaсоздайте файл main.yml следующего содержания:

dependencies:
  - { role: common,
      common_cron_job: "{{app_common_cron_job}}"
    }

Значение app_common_cron_job может быть установлен в каждой доступной группе, например group_vars \ app

У общей роли будет необходимая задача для создания задания cron с использованием предоставленного значения в common_cron_job. Если вам нужно более одного задания для каждой группы, измените код, чтобы передать структуру заданий.

Смотрите мой учебник Создание кластера Kubernetes с помощью Vagrant и Ansible для полного примера использования метапапок и зависимостей. Смотрите мой учебник Использование Ansible для инфраструктуры AWS, управляемой Terraform для примера того, как использовать групповые вары.

Хост, который присутствует во многих группах, в конечном итоге выполнит роль для каждой из своих групп, и значение common_cron_job изменится на то, что групповые переменные определяют для этой группы. В конце будут созданы все необходимые cron-задания.

Имейте в виду, что вам также понадобится способ очистить созданные задания cron, которые больше не нужны (совет: используйте переменную common_cron_job_delete и соответствующую ей задачу).