我有一组服务器的通用木偶配方。其中一个由 Puppet 管理的文件/etc/crontab
包含原始的cron.daily
,cron.weekly
和cron.monthly
条目。
这里的公共/etc/crontab
文件的问题是所有 cronjobs 在我们所有的服务器中都在完全相同的时间运行。例如,每日备份消耗了我们所有的备份服务器资源,因为所有服务器都在同时提供它。
在服务器之间随机化每天/每周/每月运行的确切分钟,同时仍然保持所有服务器之间通用的人偶配方的首选方法是什么?
我一直在考虑几个不同的选择:
- 在实际工作之前运行
sleep
& 。$RANDOM
通过这种方式,crontab
每台主机的运行时间都是相似的,但运行每日/每周作业的确切时间会有所不同。即使在同一台服务器内也会有变化(例如,每日运行间隔可能在 23-25 小时之间变化)。 - 从主机名计算一个整数值并使用
at
+“基于主机名的整数”分钟运行所有作业。有点hacky,但可能会工作...... - 其他一些方法,但是什么?
Puppet 有一个
fqdn_rand
函数,你可以使用它:您应该将脚本随机化为
sleep
.我通常用以下方法做这种事情:
sleep $((RANDOM%120)) && /bin/sh -c /path/to/my/cronjob
通过这种方式,所有 cronjobs 可以同时启动,但它们会随机休眠
0 and 120
。是的,您可以通过散列 FQDN 获得“随机”整数。在 erb 模板中:
但是 puppet 可以更优雅地做到这一点。在清单中:
这里有很多不同类型的实施示例: http ://projects.puppetlabs.com/projects/1/wiki/Cron_Patterns