У меня есть общий кукольный Рецепт набора наших серверов. Один из файлов, управляемых марионеткой, - /etc/crontab
который содержит оригинал cron.daily
, cron.weekly
и cron.monthly
записи.
Проблема общего /etc/crontab
файл здесь заключается в том, что все cronjobs запускаются в одно и то же время на всех наших серверах. Например, ежедневное резервное копирование потребляло все ресурсы нашего сервера резервного копирования, поскольку все серверы питали его одновременно.
Каков предпочтительный способ рандомизировать точную минуту ежедневных / еженедельных / ежемесячных прогонов между серверами, сохраняя при этом общий рецепт марионетки для всех серверов?
Подумывал несколько разных вариантов:
sleep
& $RANDOM
перед фактической работой. Таким образом, crontab
будет одинаковым на всех хостах, но точное время выполнения ежедневных / еженедельных заданий будет отличаться. Даже внутри одного и того же сервера будут различия (например, интервал ежедневного запуска может варьироваться от 23 до 25 часов).at
+ "целое число на основе имени хоста" минут. Немного хакерский, но может сработать ...Марионетка имеет fqdn_rand
функция, которую вы можете использовать для этого:
minute => fqdn_rand(60)
Вместо того, чтобы рандомизировать cronjobs, вы должны рандомизировать свои скрипты, чтобы sleep
.
Обычно я делаю такие вещи с:
sleep $((RANDOM%120)) && /bin/sh -c /path/to/my/cronjob
Таким образом, все cronjobs могут запускаться одновременно, но они будут случайным образом спать между 0 and 120
.
Да, вы можете получить "случайное" целое число путем хеширования FQDN. В erb-шаблоне:
<%= Time.at( fqdn.hash % 10000 ).strftime('%M') %> * * * * myuser /bin/mycommand
Но марионетка может сделать это более изящно. В манифесте:
$minute = inline_template("<%= Time.at( fqdn.hash % 10000 ).strftime('%M') %>")
cron { my-cron:
minute => $minute,
...
}
Вот много разных примеров реализации: http://projects.puppetlabs.com/projects/1/wiki/Cron_Patterns