У нас много групп серверов, например:
Каждая группа серверов имеет свои собственные задания 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 и соответствующую ей задачу).