Minutos aleatorios para las inputs crontab entre serveres

Tengo una receta común de títeres para un set de nuestros serveres. Uno de los files manejados por títeres es /etc/crontab que contiene las cron.daily , cron.weekly y cron.monthly .

El problema del file común de /etc/crontab aquí es que todos los cronjobs se ejecutan exactamente al mismo time en todos nuestros serveres. Por ejemplo, las copys de security diarias consumían todos nuestros resources de server de copy de security, ya que todos los serveres lo están alimentando al mismo time.

¿Cuál es la forma preferida de asignar random el minuto exacto de las ejecuciones diarias / semanales / mensuales entre serveres, mientras se mantiene la receta de títeres común entre todos los serveres?

He estado pensando en algunas opciones diferentes:

  • Ejecutar el sleep & $RANDOM antes del trabajo real. De esta manera, el crontab sería similar en cada host, pero el time exacto de ejecución de los trabajos diarios / semanales variaría. Habría variación incluso dentro del mismo server (por ejemplo, el intervalo de ejecución diaria podría variar entre 23-25 ​​horas).
  • Cálculo de un valor integer desde el nombre de host y ejecución de todos los trabajos con at + "el integer basado en hostname" minutos. Un poco hacky, pero podría funcionar …
  • Algún otro método, pero ¿qué?

Puppet tiene una function fqdn_rand que puede utilizar para esto:

 minute => fqdn_rand(60) 

En lugar de asignar aleatoriamente a cronjobs, debe asignar random sus guiones al sleep .

Normalmente hago este tipo de cosas con:

sleep $((RANDOM%120)) && /bin/sh -c /path/to/my/cronjob

De esta manera todos los cronjobs pueden comenzar al mismo time, pero aleatoriamente duermen entre 0 and 120 .

Sí, puede get un integer "aleatorio" mediante el hash FQDN. En erb-plantilla:

 <%= Time.at( fqdn.hash % 10000 ).strftime('%M') %> * * * * myuser /bin/mycommand 

Pero la marioneta puede hacerlo con más gracia. En manifiesto:

 $minute = inline_template("<%= Time.at( fqdn.hash % 10000 ).strftime('%M') %>") cron { my-cron: minute => $minute, ... } 

Aquí hay una gran variedad de ejemplos de implementación: http://projects.puppetlabs.com/projects/1/wiki/Cron_Patterns