Reusable Cookbook Patterns

29
Cookbook Reusability Noah Kantrowitz Balanced, Inc

description

From Chef Summit 2013

Transcript of Reusable Cookbook Patterns

Page 1: Reusable Cookbook Patterns

Cookbook ReusabilityNoah Kantrowitz

Balanced, Inc

Page 2: Reusable Cookbook Patterns

The problem

Community cookbooks only do 90% of what you need.

Page 3: Reusable Cookbook Patterns
Page 4: Reusable Cookbook Patterns

New Problem

•Proliferation of special cases.

•Complex contribution process.

•Forking during iteration.

Page 5: Reusable Cookbook Patterns

Wrapper Cookbooks

•Extension by prepend/append.

•Overriding attributes.

•chef-rewind, here be dragons.

Page 6: Reusable Cookbook Patterns

Requirements

•Responsive effort: 5% change ⇒ ~5% work

•Documented extension mechanism.

•Integration with kitchen, berks, etc.

Page 7: Reusable Cookbook Patterns

DevOps

Page 8: Reusable Cookbook Patterns

LWRPs?

•Better, but not by much.

•Still only prepend/append.

•No substitution except rewind.

Page 9: Reusable Cookbook Patterns

Enter: Classesclass Chef class Resource::Something < Resource ... end class Provider::Something < Provider ... endend

Page 10: Reusable Cookbook Patterns

Chef::Resourcedef initialize(*args) super @resource_name = :something @action = :enable @allowed_actions = [ :enable, :disable ]end

Page 11: Reusable Cookbook Patterns

Chef::Resource

def path(arg=nil) set_or_return(:path, arg, { kind_of: String })end

Page 12: Reusable Cookbook Patterns

Chef::Providerdef load_current_resourceenddef whyrun_supported? trueenddef action_enable ...end

Page 13: Reusable Cookbook Patterns

Why?

•Subclassing.

•No really, subclassing!

•Allows detailed, responsive customization.

Page 14: Reusable Cookbook Patterns

Verbosity

•A lot of boilerplate code.

•Missing some LWRP DSL goodies.

Page 15: Reusable Cookbook Patterns

Poise

Page 16: Reusable Cookbook Patterns

Poiseclass Resource::Something < Resource include Poise ...endclass Provider::Something < Provider include Poise ...end

Page 17: Reusable Cookbook Patterns

LWRP-ese

class Resource::Something < Resource include Poise actions(:enable, :disable) attribute(:path, kind_of: String)end

Page 18: Reusable Cookbook Patterns

Notifying Block

def action_enable notifying_block do ... endend

Page 19: Reusable Cookbook Patterns

Include Recipe

def action_enable include_recipe 'something'end

Page 20: Reusable Cookbook Patterns

Lazy Defaults

class Resource::Something < Resource include Poise attribute(:path, default: lazy { node['path'] } )end

Page 21: Reusable Cookbook Patterns

Option Collector

class Resource::Something < Resource include Poise attribute(:database, option_collector: True)end

Page 22: Reusable Cookbook Patterns

Option Collector

something 'one' do database host: 'a', port: 8000end

Page 23: Reusable Cookbook Patterns

Option Collector

something 'one' do database do host 'a' port 8000 endend

Page 24: Reusable Cookbook Patterns

Sub-resources

class Resource::Something < Resource include Poise(container: true)end

Page 25: Reusable Cookbook Patterns

Sub-resources

class Resource::Foo < Resource include Poise(parent: Something)end

Page 26: Reusable Cookbook Patterns

Sub-resources

something 'one' do ... foo 'asdf' do ... endend

Page 27: Reusable Cookbook Patterns

Sub-resources

something 'one' do ...end

foo 'asdf' do parent 'one'end

Page 28: Reusable Cookbook Patterns

Sub-resources

something 'one'

foo 'asdf'

Page 29: Reusable Cookbook Patterns

Distribution

• Cookbooks?

• Gems?