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

Минута рандомизации для записей crontab между серверами

У меня есть общий кукольный Рецепт набора наших серверов. Один из файлов, управляемых марионеткой, - /etc/crontab который содержит оригинал cron.daily, cron.weekly и cron.monthly записи.

Проблема общего /etc/crontab файл здесь заключается в том, что все cronjobs запускаются в одно и то же время на всех наших серверах. Например, ежедневное резервное копирование потребляло все ресурсы нашего сервера резервного копирования, поскольку все серверы питали его одновременно.

Каков предпочтительный способ рандомизировать точную минуту ежедневных / еженедельных / ежемесячных прогонов между серверами, сохраняя при этом общий рецепт марионетки для всех серверов?

Подумывал несколько разных вариантов:

Марионетка имеет 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