When you are tackling a complicated configuration deployment with Puppet, you may find yourself wishing for a feature that doesn’t exist. Sometimes you need a piece of information that is not available to you until runtime. I will use an example here that I’ve encountered in an application deployment.
My own use of Puppet tends to be on the Amazon Web Services Cloud. This leads me to want to integrate some of the metadata from Amazon’s API into Puppet. In one particular case, I wanted to use the tagging API to decide which instances my HAProxy configuration would balance. Amazon’s tagging API allows me to associate arbitrary key-value metadata “tags” with AWS resources such as machine instances. If Puppet could talk to Amazon and derive the appropriate connection strings of all the servers with a particular tag, it would greatly simplify my life!
By creating a custom function in Puppet, we are adding logic to the parsing step of the manifest compilation. The function can be called in our Puppet manifests and will be executed on the Puppet Master before communicating the compiled catalog to the agent. This means that we can use these functions to make decisions or import information from external sources, but we cannot use them to directly alter the agent host.
In my case I want to fetch some information from the AWS REST API and return it so that I can put the values in my HAProxy configuration file. I’ll start by adding a directory to my ...