It is possible to increase the readability and resiliency of your code using parameterized classes and defined types. Encapsulating sections of your code within a defined type makes your code more modular and easier to support. When the defined types are not enough, you can extend Puppet with custom types and providers written in Ruby. The details of writing providers are best learned by reading the already written providers and referring to the documentation on the Puppet Labs website. The public modules covered in an earlier chapter make use of defined types, custom types and providers, and can also serve as a starting point to write your own types. The augeasproviders
module is another module to read when looking to write your own types and providers.
In the next chapter, we will set up reporting and look at Puppet Dashboard and the Foreman.