From 13098ff934b3ba88ef5e4ba9ce2b7232c32b9082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Barczy=C5=84ski?= Date: Thu, 3 Mar 2011 03:09:55 +0100 Subject: [PATCH] cronrand - stateful (between puppet runs) randomizer eg. for cron minutes for equal load distribution --- cronrand.rb | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 cronrand.rb diff --git a/cronrand.rb b/cronrand.rb new file mode 100644 index 0000000..3dd6810 --- /dev/null +++ b/cronrand.rb @@ -0,0 +1,31 @@ +# vim: set ts=2 sw=2 et : +# TODO: path should not be hardcoded here +# +# USAGE: +# $minutes = cronrand("puppet-run", $fqdn, 59) +# file { "puppet-cron": +# name => /etc/cron.d/puppet-run", +# content => "$minutes * * * * root /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog > /dev/null 2>&1\n" +# } +# --- +# minutes will be chosen random and saved for each $fqdn, +# second puppet run on same host will create same content as first one. + +module Puppet::Parser::Functions + newfunction(:cronrand, :type => :rvalue) do |args| + job = args[0] + host = args[1] + minutes = (args[2].to_i < 60) ? args[2].to_i : 59 + filename = "/etc/puppet/modules/puppet/state/cronminutes-#{job}-#{host}" + value = 0 + + if FileTest.exists?(filename) + File.open(filename, 'r') { |fd| value = fd.gets.chomp.to_i } + else + value = rand(minutes) + File.open(filename, 'w') { |fd| fd.puts value } + end + value + end +end +