Есть ли разумный способ разбить задание cron на 4 хостах с Ansible? - PullRequest
0 голосов
/ 27 февраля 2019

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

Приложение развернуто HA в 4 системах на 2 сайтах и ​​имеет наихудший SLA в течение 1 часа.Это достигается с помощью шахматного хронона, который запускается каждые 15 минут.то есть s1 работает в 0, s2 работает в 30 s3 работает в 15, ...

Я просмотрел все виды циклов и cron и других модулей, которые поддерживает Ansible, и не могу найти способ, которыйон поддерживает увеличение целого числа на 15 при перемещении по списку хостов, и, возможно, это глупый способ делать что-либо.

Единственное взаимодействие, которое эти 4 сервера имеют между собой, - это каталог на неHA NFS поделиться.Итак, причина, по которой я делаю это как 15-минутный шахматный хрон, состоит в том, чтобы пережить сетевые разделы и смерть соединения NFS.

Мои другие мысли ... Я могу просто прикусить пулю* / 15, и имеют архитектуру, основанную на молитве о том, что NFS никогда не умрет, что сделало бы написание Ansible playbook тривиальным.Я также рассматриваю возможность развертывания этого с помощью Fabric или сценария Bash, просто процесс утверждения планов внедрения и внесения изменений, следуя им, очень труден, и я просто хочу упростить шаги, которые кто-то должен предпринять поздно вночь.

1 Ответ

0 голосов
/ 27 февраля 2019

Решение 1

Вы можете использовать host_vars или group_vars, либо в отдельных файлах, либо непосредственно в инвентаре.
Я попытаюсь привести простой пример, который соответствует вашему описанию,используя только файл инвентаря (и книгу, в которой применяется cron):

[site1]
host1 cron_restart_minute=0
host2 cron_restart_minute=30
host3 cron_restart_minute=15
host4 cron_restart_minute=45

[site2]
host5 cron_restart_minute=0
host6 cron_restart_minute=30
host7 cron_restart_minute=15
host8 cron_restart_minute=45

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

В пьесе или роли вы можете просто обратиться к переменной.На том же хосте:

- name: Configure the cron job
  cron:
    # your other options
    minute: "{{ cron_restart_minute }}"

На другом хосте вы можете получить доступ к переменным других хостов, например:
hostvars[host2].cron_restart_minute

Решение 2

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

Пример:

- name: Set fact for cron_restart_minute
  set_fact:
    cron_restart_minute: "{{ 60 / groups[group_names[0]].length * (1 + groups[group_names[0]].index(inventory_hostname)) | int }}"

Я не проверял это выражение, но уверен, что оно работает.Это Питон / Джинджа2.group_names - это массив из 1 элемента, приведенный выше инвентаризации, поскольку ни один хост не входит в две группы одновременно.groups содержит все хосты в группе, а затем мы находим его длину или индекс текущего хоста по его inventory_hostname (0, 1, 2, 3).

Ссылки на соответствующие документы:
Инвентарь
Переменные , в частности эта часть .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...