PuppetCamp NYC - Building Scalable Modules
Post on 10-May-2015
1950 Views
Preview:
DESCRIPTION
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