Showing posts with label ruby. Show all posts
Showing posts with label ruby. Show all posts

Thursday, March 20, 2014

My first custom Puppet function in Ruby

Here the doc http://docs.puppetlabs.com/guides/custom_functions.html

I thought this was Rocket Science, but it's quite simple, once you overcome the normal, healthy, instinctive repugnance for a stinky stupid language like Ruby. Anyway if you are already coping with Puppet, Ruby should not be worse.

Inside your Puppet module, create these folders: lib/puppet/parser/functions, and inside your function file "stage_from_domain.rb" (file name should match the function name, and extension = .rb).

The file should start with a "module Puppet::Parser::Functions" declaration (no clue why... just to make your pronounce some meaningless magic words initiating you to the Puppet Mysteries - luckily they don't ask you to kill a kitten).

The function returns a substring in the middle of a string. Since we RETURN a value, we must declare it as ":type => :rvalue":
module Puppet::Parser::Functions
  newfunction(:stage_from_domain, :type => :rvalue) do |args|
    #e.g. domain_name='osbpr1do'
    domain_name = args[0]
    #we should remove the leading "osb" and the trailing "do"
    if domain_name[0, 3] != 'osb'
     raise ArgumentError, 'domain_name should start with osb' 
    end
    if domain_name[domain_name.length - 2, domain_name.length] != 'do'
     raise ArgumentError, 'domain_name should end with do' 
    end
    domain_name[3, domain_name.length - 5]
  end
end


The REALLY weirdo thing is how to return the value: simply end your function specifying the rvalue to return (in my case "domain_name[3, domain_name.length - 5]". No old-fashioned, READABLE "return" statements... who needs clarity....

That's all, you can now use the stage_from_domain function inside Puppet. Cool! Maybe after all I will be able to turn Puppet into something manageable... especially the day they will decide to support Groovy, instead of Stinking Ruby.