When doing a lot of devops stuff with Puppet, you might get to a point, where the existing types are not enough. That point is usually reached, when a task at hand becomes extraordinary complex when trying to achieve it with the Puppet DSL. One example of such a case could be if you need to interact with a system binary a lot. In this case, writing your own puppet type might be handy.
Now where to start, if you want to write your own type?
Overview: modeling and providing types
First thing that you should know about puppet types (if you do not already): a puppet resource type consists of a type and one or more providers.
The type is a model of the resource and describes which properties (e.g. the uid of a user resource) and parameters (like the managehome parameter) a resource has. It’s a good idea to start with a rough idea of what properties you’ll be manage with your resource and what values they will accept, since the type also does the job of validation.
What actually needs to be done on the target system is what the provider is up to. There can be different providers for different implementations (e.g. a native ruby implementation or an implementation using a certain utility), different operating systems and other conditions.
A combination of a type and a matching provider is what forms a (custom) resource type.
Next I’ll show you some resources about puppet provider development, that I found useful:
Actually types and resources is quiet well documented in the official documentation, although it might not get to much in the details:
A hands-on tutorial in multiple parts with good explanations are the blog posts by Gary Larizza:
- Part 1: Fun with providers (about types and validation)
- Part 2: Who abstracted my ruby? (about the provider part)
The probably most complete information, including explanations of the puppet resource model and it’s resource abstraction layer (RAL), can be found in the book Puppet Types and providers by Dan Bode and Nan Liu.
The puppet source:
Last but not least, it’s always worth a peek at how others did it. The puppet source contains all providers of the official puppet release, as well as the base libraries for puppet types and providers with their api documentation: https://github.com/puppetlabs/puppet/