Created
March 13, 2011 13:22
-
-
Save kwilczynski/868080 to your computer and use it in GitHub Desktop.
Select minutes for a crontab job based on the job and host name and make the value persistent
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# persistent_crontab_minutes.rb | |
# | |
require 'md5' | |
module Puppet::Parser::Functions | |
newfunction(:persistent_crontab_minutes, :type => :rvalue) do |arguments| | |
raise(Puppet::ParseError, "Wrong number of arguments " + | |
"given (#{arguments.size} for 2)") if arguments.size < 2 | |
value = 0 | |
job = arguments[0] | |
host = arguments[1] | |
environment = Puppet[:environment] | |
# We select first directory that exists. This might not be the best idea ... | |
modules = Puppet[:modulepath].split(':').select { |i| File.exists?(i) }.first | |
raise(Puppet::ParseError, "Unable to determine the storage " + | |
"directory for Puppet modules") unless modules | |
# Prepare the file where we store current value ... | |
file = "/puppet/state/crontab/#{host}-#{job}.minutes" | |
file = File.join(modules, file) | |
if FileTest.exists?(file) | |
File.open(file, 'r') { |f| value = f.read.to_i } | |
raise(Puppet::ParseError, "The value for minutes in the file `%s' " + | |
"is out of the range from 0 to 59 inclusive") unless value < 60 | |
else | |
# | |
# Pick a random number based on the job and host name. This will yield | |
# the same value for exactly the same combination of the job and host name. | |
# | |
value = MD5.new(job_name + host).to_s.hex % 60 | |
# Minutes are from 0 to 59 inclusive ... | |
value = value < 60 ? value : 59 | |
File.open(file, 'w') { |f| f.write(value) } | |
end | |
# Tell Puppet to keep an eye on this file ... | |
parser = Puppet::Parser::Parser.new(environment) | |
parser.watch_file(file) if File.exists?(file) | |
return value | |
end | |
end | |
# vim: set ts=2 sw=2 et : |
I have absolutely no idea what watch_file does...
Does puppetmaster cache rvalue of such functions? if it caches and watch_file (as I assume) causes puppetmaster to invalidate cache if file has changed then it's correct... I think...
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
There is one thing I am not sure about. This is whether we need Puppet::Parser::Parser#watch_file there at all? Documentation, what support tickets have to say and the "word on the street" are all in contradiction to each-other.