随机分配服务器之间的crontab条目

我有一套我们的服务器的通用木偶配方。 其中一个puppetpipe理的文件是/etc/crontab ,包含原始的cron.dailycron.weeklycron.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