Puppet Types and Providers: Extending Puppet with Ruby