PuppetCamp NYC - Building Scalable Modules

Post on 10-May-2015

1950 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Building Puppet modules for scalability, Eric Shamow, PuppetCamp NYC 4/2012

Transcript

Modules 201

Eric Shamow | PuppetCamp NYC

Writing Flexible and Scalable Puppet

Friday, April 27, 12

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

How Did We Get Here?

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

Friday, April 27, 12

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

I never thought...

Friday, April 27, 12

I never thought...

• RHEL 6 would come out

Friday, April 27, 12

I never thought...

• RHEL 6 would come out

• My company would switch to Debian

Friday, April 27, 12

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

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

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

Ur Doin It Wrong

Friday, April 27, 12

Puppet is DeclarativeShoehorning conditional logic into

declarative language?

Friday, April 27, 12

Puppet is DeclarativeShoehorning conditional logic into

declarative language?

Please do not do this:

Friday, April 27, 12

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

When Logic Fails

Friday, April 27, 12

Organizing Your Data

Friday, April 27, 12

Organizing Your Data

• Hiera

Friday, April 27, 12

Organizing Your Data

• Hiera

• External Node Classifiers

Friday, April 27, 12

Organizing Your Data

• Hiera

• External Node Classifiers

• Custom Functions

Friday, April 27, 12

Code Models Reality

Friday, April 27, 12

Code Models Reality

• Move complexity closer to where it is in real life

Friday, April 27, 12

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

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

Please Don’t Make Me Edit Your Module

Friday, April 27, 12

Parameterized Classes

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

Friday, April 27, 12

params.pp Pattern

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

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

Friday, April 27, 12

params.pp Pattern + hiera

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

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

Friday, April 27, 12

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

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

Limit Inheritance

Friday, April 27, 12

Limit Inheritance

Friday, April 27, 12

Limit Inheritance

• Favor composition over inheritance

Friday, April 27, 12

Limit Inheritance

• Favor composition over inheritance

• Inheritance + dynamic variable scoping = PAIN

Friday, April 27, 12

Limit Inheritance

• Favor composition over inheritance

• Inheritance + dynamic variable scoping = PAIN

• Useful at the edges

Friday, April 27, 12

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

Stop Being Surprised by Change

Friday, April 27, 12

Stop Being Surprised by Change

Friday, April 27, 12

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

Stop Being Surprised by Change

Friday, April 27, 12

• 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

• 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

Protect Yourself Against Unintentional Defaults

Friday, April 27, 12

• Always provide a default case

Protect Yourself Against Unintentional Defaults

Friday, April 27, 12

• Always provide a default case

• In most cases that default case should be failure

Protect Yourself Against Unintentional Defaults

Friday, April 27, 12

• 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

Protect Yourself Against Unintentional Defaults

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

Friday, April 27, 12

RememberYou Don’t Have To Think of

Everything

Friday, April 27, 12

RememberYou Don’t Have To Think of

Everything

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

Friday, April 27, 12

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

And then we haz a community!

Friday, April 27, 12

Thank You

Eric Shamoweric@puppetlabs.comhttp://opsrealist.info

@eshamow

Friday, April 27, 12

top related