我有一个共同点木偶一组服务器的配方。其中一个 puppet 管理文件是/etc/crontab
包含原始cron.daily
、cron.weekly
和cron.monthly
条目。
此处公用文件的问题/etc/crontab
是,所有 cronjob 都在我们所有服务器上同时运行。例如,每日备份会消耗我们所有备份服务器的资源,因为所有服务器都同时为其提供数据。
在保持所有服务器之间木偶配方通用的同时,随机化服务器之间每日/每周/每月运行的精确分钟的首选方法是什么?
我一直在考虑几个不同的选择:
- 在实际作业之前运行
sleep
&$RANDOM
。这样,crontab
每个主机上的作业都会类似,但运行每日/每周作业的确切时间会有所不同。即使在同一台服务器内也会有差异(例如,每日运行间隔可能在 23-25 小时之间变化)。 - 根据主机名计算整数值,并使用
at
+“基于主机名的整数”分钟运行所有作业。有点老套,但可能有效... - 还有其他方法,但是是什么呢?
答案1
Puppet 有一个fqdn_rand
您可以为此使用以下函数:
minute => fqdn_rand(60)
答案2
您不应该随机化 cronjobs,而应该随机化您的脚本sleep
。
我通常这样做:
sleep $((RANDOM%120)) && /bin/sh -c /path/to/my/cronjob
这样,所有的 cronjobs 就可以同时启动,但它们会在 之间随机休眠0 and 120
。
答案3
是的,您可以通过散列 FQDN 来获取“随机”整数。在 erb-template 中:
<%= Time.at( fqdn.hash % 10000 ).strftime('%M') %> * * * * myuser /bin/mycommand
但是 puppet 可以做得更优雅。在 manifest 中:
$minute = inline_template("<%= Time.at( fqdn.hash % 10000 ).strftime('%M') %>")
cron { my-cron:
minute => $minute,
...
}
答案4
这里有很多不同类型的实现示例: http://projects.puppetlabs.com/projects/1/wiki/Cron_Patterns