Решение 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
).
Ссылки на соответствующие документы:
Инвентарь
Переменные , в частности эта часть .