我有一套我们的服务器的通用木偶配方。 其中一个puppetpipe理的文件是/etc/crontab ,包含原始的cron.daily , cron.weekly和cron.monthly条目。
这里常见的/etc/crontab文件的问题是,所有的cronjob都在同一时间运行在我们所有的服务器上。 例如,每日备份消耗所有备份服务器资源,因为所有服务器都在同一时间进行备份。
在服务器之间每天/每周/每月运行的确切分钟随机化的首选方法是什么?同时仍然保持所有服务器之间的木偶配方通用?
我一直在想几个不同的select:
sleep & $RANDOM 。 通过这种方式, crontab在每个主机上都是相似的,但是运行每日/每周工作的确切时间会有所不同。 即使在同一个服务器内部也会有变化(例如每天的运行间隔可能在23-25小时之间变化)。 木偶有一个fqdn_rand函数,你可以使用这个:
minute => fqdn_rand(60)
而不是随机cronjobs,你应该随机化你的脚本sleep 。
我通常做这样的事情:
sleep $((RANDOM%120)) && /bin/sh -c /path/to/my/cronjob
通过这种方式,所有的cronjobs可以同时启动,但是它们将在0 and 120之间随机hibernate。
是的,您可以通过散列FQDN来获得“随机”整数。 在erb-template中:
<%= 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, ... }
这里有很多不同types的实现示例: http : //projects.puppetlabs.com/projects/1/wiki/Cron_Patterns