O Puppet tem uma função fqdn_rand
que você pode usar para isso:
minute => fqdn_rand(60)
Eu tenho uma receita comum de fantoche para um conjunto de nossos servidores. Um dos arquivos gerenciados por bonecos é /etc/crontab
, que contém as entradas originais cron.daily
, cron.weekly
e cron.monthly
.
O problema do arquivo comum /etc/crontab
aqui é que todos os cronjobs são executados exatamente ao mesmo tempo em todos os nossos servidores. Por exemplo, os backups diários consumiam todos os recursos do nosso servidor de backup, já que todos os servidores o estão alimentando ao mesmo tempo.
Qual é a maneira preferida de randomizar o minuto exato das execuções diárias / semanais / mensais entre servidores, mantendo a receita de fantoches entre todos os servidores?
Eu estive pensando em algumas opções diferentes:
sleep
& $RANDOM
antes do trabalho real. Dessa forma, o crontab
seria semelhante em todos os hosts, mas o tempo exato de execução dos trabalhos diários / semanais variaria. Haveria variação mesmo dentro do mesmo servidor (por exemplo, o intervalo de execução diária pode variar entre 23 e 25 horas). at
+ "o inteiro baseado em nome do host" minutos. Um pouco hacky, mas pode funcionar ... O Puppet tem uma função fqdn_rand
que você pode usar para isso:
minute => fqdn_rand(60)
Em vez de randomizar os cronjobs, você deve randomizar seus scripts para sleep
.
Eu costumo fazer esse tipo de coisa com:
sleep $((RANDOM%120)) && /bin/sh -c /path/to/my/cronjob
Desta forma, todos os cronjobs podem iniciar ao mesmo tempo, mas aleatoriamente dormirão entre 0 and 120
.
Sim, você pode obter um número inteiro "aleatório" ao fazer o hash do FQDN. Em erb-template:
<%= Time.at( fqdn.hash % 10000 ).strftime('%M') %> * * * * myuser /bin/mycommand
Mas o fantoche pode fazer isso de maneira mais elegante. Em manifesto:
$minute = inline_template("<%= Time.at( fqdn.hash % 10000 ).strftime('%M') %>")
cron { my-cron:
minute => $minute,
...
}
Aqui estão vários tipos diferentes de exemplos de implementação: link