50
Modules 201 Eric Shamow | PuppetCamp NYC Writing Flexible and Scalable Puppet Friday, April 27, 12

Puppet Module Writing 201

  • Upload
    eshamow

  • View
    817

  • Download
    0

Embed Size (px)

DESCRIPTION

Writing Puppet modules for scalability and future growth

Citation preview

Page 1: Puppet Module Writing 201

Modules 201

Eric Shamow | PuppetCamp NYC

Writing Flexible and Scalable Puppet

Friday, April 27, 12

Page 2: Puppet Module Writing 201

Who Am I?

• Senior Professional Services Engineer for Puppet Labs

• Former Operations Manager

• Recovering Sysadmin

• Travel around helping people make Puppet even more awesome

• Not Shamwow. If you came to the wrong talk you can leave now

Friday, April 27, 12

Page 3: Puppet Module Writing 201

How Did We Get Here?

The module seemed just fine when I wrote it...

Friday, April 27, 12

Page 4: Puppet Module Writing 201

How Did We Get Here?

The module seemed just fine when I wrote it...

(I never thought RHEL 6 would come out)

Friday, April 27, 12

Page 5: Puppet Module Writing 201

I never thought...

Friday, April 27, 12

Page 6: Puppet Module Writing 201

I never thought...

• RHEL 6 would come out

Friday, April 27, 12

Page 7: Puppet Module Writing 201

I never thought...

• RHEL 6 would come out

• My company would switch to Debian

Friday, April 27, 12

Page 8: Puppet Module Writing 201

I never thought...

• RHEL 6 would come out

• My company would switch to Debian

• Other people would want to reuse the module

Friday, April 27, 12

Page 9: Puppet Module Writing 201

I never thought...

• RHEL 6 would come out

• My company would switch to Debian

• Other people would want to reuse the module

• I’d want to use only a part of the module

Friday, April 27, 12

Page 10: Puppet Module Writing 201

I never thought...

• RHEL 6 would come out

• My company would switch to Debian

• Other people would want to reuse the module

• I’d want to use only a part of the module

• ...maybe as a part of something else

Friday, April 27, 12

Page 11: Puppet Module Writing 201

Ur Doin It Wrong

Friday, April 27, 12

Page 12: Puppet Module Writing 201

Puppet is DeclarativeShoehorning conditional logic into

declarative language?

Friday, April 27, 12

Page 13: Puppet Module Writing 201

Puppet is DeclarativeShoehorning conditional logic into

declarative language?

Please do not do this:

Friday, April 27, 12

Page 14: Puppet Module Writing 201

Puppet is DeclarativeShoehorning conditional logic into

declarative language?

Please do not do this:case $::operatingsystem { ‘redhat’: { if $::fqdn == “bobmarley” { file { ‘foo’: ... } else { ... ...}

Friday, April 27, 12

Page 15: Puppet Module Writing 201

When Logic Fails

Friday, April 27, 12

Page 16: Puppet Module Writing 201

Organizing Your Data

Friday, April 27, 12

Page 17: Puppet Module Writing 201

Organizing Your Data

• Hiera

Friday, April 27, 12

Page 18: Puppet Module Writing 201

Organizing Your Data

• Hiera

• External Node Classifiers

Friday, April 27, 12

Page 19: Puppet Module Writing 201

Organizing Your Data

• Hiera

• External Node Classifiers

• Custom Functions

Friday, April 27, 12

Page 20: Puppet Module Writing 201

Code Models Reality

Friday, April 27, 12

Page 21: Puppet Module Writing 201

Code Models Reality

• Move complexity closer to where it is in real life

Friday, April 27, 12

Page 22: Puppet Module Writing 201

Code Models Reality

• Move complexity closer to where it is in real life

• If your CMDB contains lots of exceptions, that’s where you should read from

Friday, April 27, 12

Page 23: Puppet Module Writing 201

Code Models Reality

• Move complexity closer to where it is in real life

• If your CMDB contains lots of exceptions, that’s where you should read from

• If there is contorted logic, keep it away from nuts and bolts module mechanics

Friday, April 27, 12

Page 24: Puppet Module Writing 201

Please Don’t Make Me Edit Your Module

Friday, April 27, 12

Page 25: Puppet Module Writing 201

Parameterized Classes

class motd ( $pci_enabled = true, $owner = ‘bob’,) { ...}

Friday, April 27, 12

Page 26: Puppet Module Writing 201

params.pp Pattern

class motd::params { $owner = ‘Bob’}

class motd ( $owner = $motd::params::owner) {

Friday, April 27, 12

Page 27: Puppet Module Writing 201

params.pp Pattern + hiera

class motd::params { $owner = hiera(‘owner’,‘Bob’)}

class motd ( $owner = $motd::params::owner) {

Friday, April 27, 12

Page 28: Puppet Module Writing 201

Outsource Logic to Submodules

class mysql::params { $server_package = $::operatingsystem ? { ‘redhat’ => ‘mysql-server’, ... }}

class mysql::server { package { ‘mysql-server’: name => $mysql::params::server_package, ... }}

Friday, April 27, 12

Page 29: Puppet Module Writing 201

Be as Modular as Possible

class mysql::server { package { ‘mysql-server’: name => $mysql::params::server_package, ... }}class mysql::client { ...}class mysql { include mysql::client include mysql::server}

Friday, April 27, 12

Page 30: Puppet Module Writing 201

Limit Inheritance

Friday, April 27, 12

Page 31: Puppet Module Writing 201

Limit Inheritance

Friday, April 27, 12

Page 32: Puppet Module Writing 201

Limit Inheritance

• Favor composition over inheritance

Friday, April 27, 12

Page 33: Puppet Module Writing 201

Limit Inheritance

• Favor composition over inheritance

• Inheritance + dynamic variable scoping = PAIN

Friday, April 27, 12

Page 34: Puppet Module Writing 201

Limit Inheritance

• Favor composition over inheritance

• Inheritance + dynamic variable scoping = PAIN

• Useful at the edges

Friday, April 27, 12

Page 35: Puppet Module Writing 201

Limit Inheritance

• Favor composition over inheritance

• Inheritance + dynamic variable scoping = PAIN

• Useful at the edges

• Useful for overriding/extending in limited circumstances

Friday, April 27, 12

Page 36: Puppet Module Writing 201

Stop Being Surprised by Change

Friday, April 27, 12

Page 37: Puppet Module Writing 201

Stop Being Surprised by Change

Friday, April 27, 12

Page 38: Puppet Module Writing 201

• You don’t have to define every Operating System or version

Stop Being Surprised by Change

Friday, April 27, 12

Page 39: Puppet Module Writing 201

• You don’t have to define every Operating System or version

• Assume cutovers won’t be clean - you will be 50% RHEL 5 and 50% RHEL 6 for a while

Stop Being Surprised by Change

Friday, April 27, 12

Page 40: Puppet Module Writing 201

• You don’t have to define every Operating System or version

• Assume cutovers won’t be clean - you will be 50% RHEL 5 and 50% RHEL 6 for a while

• And even when you aren’t, you’ll be 98% RHEL 6 and 2% RHEL 5 until the end of time.

Stop Being Surprised by Change

Friday, April 27, 12

Page 41: Puppet Module Writing 201

Protect Yourself Against Unintentional Defaults

Friday, April 27, 12

Page 42: Puppet Module Writing 201

• Always provide a default case

Protect Yourself Against Unintentional Defaults

Friday, April 27, 12

Page 43: Puppet Module Writing 201

• Always provide a default case

• In most cases that default case should be failure

Protect Yourself Against Unintentional Defaults

Friday, April 27, 12

Page 44: Puppet Module Writing 201

• Always provide a default case

• In most cases that default case should be failure

• Use the stdlib :fail method to fail gracefully.

Protect Yourself Against Unintentional Defaults

Friday, April 27, 12

Page 45: Puppet Module Writing 201

Protect Yourself Against Unintentional Defaults

class mysql::params { case $::operatingsystem { ‘redhat’: { $serverpkg = ‘mysql-server’ } default: { fail(‘MySQL Server package undefined.’) } }}

Friday, April 27, 12

Page 46: Puppet Module Writing 201

RememberYou Don’t Have To Think of

Everything

Friday, April 27, 12

Page 47: Puppet Module Writing 201

RememberYou Don’t Have To Think of

Everything

Leave room for others to improve your modules without refactoring them...

Friday, April 27, 12

Page 48: Puppet Module Writing 201

RememberYou Don’t Have To Think of

Everything

Leave room for others to improve your modules without refactoring them...

...and then you get to benefit and re-merge their changes when they do.

Friday, April 27, 12

Page 49: Puppet Module Writing 201

And then we haz a community!

Friday, April 27, 12

Page 50: Puppet Module Writing 201

Thank You

Eric [email protected]://opsrealist.info

@eshamow

Friday, April 27, 12