ypes and providers are some of the most powerful abstractions within Puppet, and extending them to model resources outside the scope of simple types can make configuration management extraordinarily useful. Taking the step to extend Puppet's functionality beyond standard resources like users and files can be daunting, though, and getting started in Puppet's Ruby libraries is a different beast than the Puppet language. In this presentation we'll look at an illustrative example of how Puppet can be used to manage custom types in a sophisticated and extensible way, ultimately bridging the gap between Puppet types and resources that can be modeled as objects over RESTful interfaces. Using real module code as an example, we'll look at how combining the declarative nature of Puppet resources with any command or REST interface can make managing complicated systems easier (Elasticsearch being the illustrative example). Testing will also be covered to demonstrate how custom types and providers can offer even more code quality and assurance than basic Puppet manifests. Attendees will learn about how to write Puppet modules (including types and providers), how to use Puppet Ruby APIs, module testing, and Elasticsearch APIs.