PuppetCamp NYC - Building Scalable Modules
Upcoming SlideShare
Loading in...5
×
 

PuppetCamp NYC - Building Scalable Modules

on

  • 2,277 views

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

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

Statistics

Views

Total Views
2,277
Views on SlideShare
2,134
Embed Views
143

Actions

Likes
3
Downloads
12
Comments
0

3 Embeds 143

http://lanyrd.com 140
http://us-w1.rockmelt.com 2
https://puppetlabs.com 1

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    PuppetCamp NYC - Building Scalable Modules PuppetCamp NYC - Building Scalable Modules Presentation Transcript

    • Modules 201 Writing Flexible and Scalable Puppet Eric Shamow | PuppetCamp NYCFriday, 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 nowFriday, 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 outFriday, April 27, 12
    • I never thought... • RHEL 6 would come out • My company would switch to DebianFriday, April 27, 12
    • I never thought... • RHEL 6 would come out • My company would switch to Debian • Other people would want to reuse the moduleFriday, 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 moduleFriday, 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 elseFriday, April 27, 12
    • Ur Doin It WrongFriday, April 27, 12
    • Puppet is Declarative Shoehorning conditional logic into declarative language?Friday, April 27, 12
    • Puppet is Declarative Shoehorning conditional logic into declarative language? Please do not do this:Friday, April 27, 12
    • Puppet is Declarative Shoehorning 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 FailsFriday, April 27, 12
    • Organizing Your DataFriday, April 27, 12
    • Organizing Your Data • HieraFriday, April 27, 12
    • Organizing Your Data • Hiera • External Node ClassifiersFriday, April 27, 12
    • Organizing Your Data • Hiera • External Node Classifiers • Custom FunctionsFriday, April 27, 12
    • Code Models RealityFriday, April 27, 12
    • Code Models Reality • Move complexity closer to where it is in real lifeFriday, 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 fromFriday, 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 mechanicsFriday, April 27, 12
    • Please Don’t Make Me Edit Your ModuleFriday, 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 InheritanceFriday, April 27, 12
    • Limit InheritanceFriday, April 27, 12
    • Limit Inheritance • Favor composition over inheritanceFriday, April 27, 12
    • Limit Inheritance • Favor composition over inheritance • Inheritance + dynamic variable scoping = PAINFriday, April 27, 12
    • Limit Inheritance • Favor composition over inheritance • Inheritance + dynamic variable scoping = PAIN • Useful at the edgesFriday, April 27, 12
    • Limit Inheritance • Favor composition over inheritance • Inheritance + dynamic variable scoping = PAIN • Useful at the edges • Useful for overriding/extending in limited circumstancesFriday, April 27, 12
    • Stop Being Surprised by ChangeFriday, April 27, 12
    • Stop Being Surprised by ChangeFriday, April 27, 12
    • Stop Being Surprised by Change • You don’t have to define every Operating System or versionFriday, April 27, 12
    • Stop Being Surprised by Change • 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 whileFriday, April 27, 12
    • Stop Being Surprised by Change • 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.Friday, April 27, 12
    • Protect Yourself Against Unintentional DefaultsFriday, April 27, 12
    • Protect Yourself Against Unintentional Defaults • Always provide a default caseFriday, April 27, 12
    • Protect Yourself Against Unintentional Defaults • Always provide a default case • In most cases that default case should be failureFriday, April 27, 12
    • Protect Yourself Against Unintentional Defaults • Always provide a default case • In most cases that default case should be failure • Use the stdlib :fail method to fail gracefully.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
    • Remember You Don’t Have To Think of EverythingFriday, April 27, 12
    • Remember You Don’t Have To Think of Everything Leave room for others to improve your modules without refactoring them...Friday, April 27, 12
    • Remember You 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 Shamow eric@puppetlabs.com http://opsrealist.info @eshamowFriday, April 27, 12