puppet camp berlin 2014: advanced puppet design

111
Advanced Puppet Design Craig Dunn, Puppet Camp Berlin 2014 Friday, 11 April 14

Upload: puppet-labs

Post on 27-Aug-2014

1.252 views

Category:

Software


2 download

DESCRIPTION

"Advanced Puppet Design" presented at Puppet Camp Berlin 2014 by Craig Dunn

TRANSCRIPT

Page 1: Puppet Camp Berlin 2014: Advanced Puppet Design

Advanced Puppet Design

Craig Dunn, Puppet Camp Berlin 2014

Friday, 11 April 14

Page 2: Puppet Camp Berlin 2014: Advanced Puppet Design

Hello

• Craig Dunn

• Puppet user since 2008

• Previously worked for Puppet Labs

• Founder of Enviatics

• IT automation engineer and trainer

• Based in Spain but work anywhere

Friday, 11 April 14

Page 3: Puppet Camp Berlin 2014: Advanced Puppet Design

My talk

• Avoiding pain

• Writing good modules

• Challenges of codebase design

• Roles / Profiles

Friday, 11 April 14

Page 4: Puppet Camp Berlin 2014: Advanced Puppet Design

But first....Everyone loves polls, right?

Friday, 11 April 14

Page 5: Puppet Camp Berlin 2014: Advanced Puppet Design

Thinking right

• Business has requirements

• We use technology to fulfill them

• But it’s not that simple!

Friday, 11 April 14

Page 6: Puppet Camp Berlin 2014: Advanced Puppet Design

“Business logic does not oftenalign with technology design”

Friday, 11 April 14

Page 7: Puppet Camp Berlin 2014: Advanced Puppet Design

Business requirement

“We have 3 applications we

need to deploy using Puppet”

Friday, 11 April 14

Page 8: Puppet Camp Berlin 2014: Advanced Puppet Design

Puppetize

• Write 3 Puppet modules for 3 applications

• Because that was the requirement

• Was it?

Friday, 11 April 14

Page 9: Puppet Camp Berlin 2014: Advanced Puppet Design

It’s not working

Friday, 11 April 14

Page 10: Puppet Camp Berlin 2014: Advanced Puppet Design

Let’s suppose

• Each “application” is a set of shared components implemented different ways

Friday, 11 April 14

Page 11: Puppet Camp Berlin 2014: Advanced Puppet Design

The business view

Application Y Application Z

Application X

Friday, 11 April 14

Page 12: Puppet Camp Berlin 2014: Advanced Puppet Design

The technical reality

Application YApplication Z

Application X

Friday, 11 April 14

Page 13: Puppet Camp Berlin 2014: Advanced Puppet Design

Danger Signs

• Resources being declared in two modules

• You don’t know where your implementation “fits”

• Lot’s of logic at a node level

• Repetition and duplication

• The if statement is your go-to-guy

Friday, 11 April 14

Page 14: Puppet Camp Berlin 2014: Advanced Puppet Design

Catastrophic Signsif ($::hostname =~ /^host[0-3].*/) { package { ‘my-special-app’: ensure => installed, }}

Friday, 11 April 14

Page 15: Puppet Camp Berlin 2014: Advanced Puppet Design

Catastrophic Signsif !defined(Package[‘httpd’]) { package { ‘httpd’: ensure => installed, }}

Friday, 11 April 14

Page 16: Puppet Camp Berlin 2014: Advanced Puppet Design

Catastrophic Signsensure_resource(‘package’,‘httpd’,{‘ensure’ => ‘installed’})

Friday, 11 April 14

Page 17: Puppet Camp Berlin 2014: Advanced Puppet Design

Catastrophic Signsensure_resource(‘package’,‘httpd’,{‘ensure’ => ‘installed’})

if function_defined_with_params(["#{type}[#{item}]", params])      Puppet.debug("Resource #{type}[#{item}] not created because it already exists")    else      Puppet::Parser::Functions.function(:create_resources)      function_create_resources([type.capitalize, { item => params }])    end

Friday, 11 April 14

Page 18: Puppet Camp Berlin 2014: Advanced Puppet Design

World ending signs

• You use parser=future in production

• You aren’t regretting it yet

• You then implemented order=manifest

Friday, 11 April 14

Page 19: Puppet Camp Berlin 2014: Advanced Puppet Design

An unhappy Puppet

Friday, 11 April 14

Page 20: Puppet Camp Berlin 2014: Advanced Puppet Design

Stop thinking about what it looks like

• Break everything down into components

• Granularity is the key

• Think about what it actually is

Friday, 11 April 14

Page 21: Puppet Camp Berlin 2014: Advanced Puppet Design

Writing modules

• Granularity

• Portability

• Flexibility of implementation

Friday, 11 April 14

Page 22: Puppet Camp Berlin 2014: Advanced Puppet Design

A bad moduleclass web {

$docroot=’/var/www/sites’ $listenaddr=‘10.0.1.10’ $servername=‘myweb.foo.com’ package { ‘httpd’: ensure => installed, }

package { ‘php5’: ensure => installed, require => Package[‘httpd’], }

package { ‘mysql-server’: ensure => installed, }

file { ‘/etc/httpd/httpd.conf’: ensure => file, content => template(‘web/httpd.conf.erb’), }}

Friday, 11 April 14

Page 23: Puppet Camp Berlin 2014: Advanced Puppet Design

A bad moduleclass web {

$docroot=’/var/www/sites’ $listenaddr=‘10.0.1.10’ $servername=‘myweb.foo.com’ package { ‘httpd’: ensure => installed, }

package { ‘php5’: ensure => installed, require => Package[‘httpd’], }

package { ‘mysql-server’: ensure => installed, }

file { ‘/etc/httpd/httpd.conf’: ensure => file, content => template(‘web/httpd.conf.erb’), }}

Granularity

Friday, 11 April 14

Page 24: Puppet Camp Berlin 2014: Advanced Puppet Design

A bad moduleclass web {

$docroot=’/var/www/sites’ $listenaddr=‘10.0.1.10’ $servername=‘myweb.foo.com’ package { ‘httpd’: ensure => installed, }

package { ‘php5’: ensure => installed, require => Package[‘httpd’], }

package { ‘mysql-server’: ensure => installed, }

file { ‘/etc/httpd/httpd.conf’: ensure => file, content => template(‘web/httpd.conf.erb’), }}

Portability

Granularity

Friday, 11 April 14

Page 25: Puppet Camp Berlin 2014: Advanced Puppet Design

A bad moduleclass web {

$docroot=’/var/www/sites’ $listenaddr=‘10.0.1.10’ $servername=‘myweb.foo.com’ package { ‘httpd’: ensure => installed, }

package { ‘php5’: ensure => installed, require => Package[‘httpd’], }

package { ‘mysql-server’: ensure => installed, }

file { ‘/etc/httpd/httpd.conf’: ensure => file, content => template(‘web/httpd.conf.erb’), }}

Portability

Implementation

Granularity

Friday, 11 April 14

Page 26: Puppet Camp Berlin 2014: Advanced Puppet Design

Keep your modulesgranular

• Manage only resources in the scope of the module

• Small modules are ok!

Friday, 11 April 14

Page 27: Puppet Camp Berlin 2014: Advanced Puppet Design

A granular moduleclass apache {

$docroot=’/var/www/sites’ $listenaddr=‘10.0.1.10’ $servername=‘myweb.foo.com’ package { ‘httpd’: ensure => installed, }

file { ‘/etc/httpd/httpd.conf’: ensure => file, content => template(‘web/httpd.conf.erb’), }}

Friday, 11 April 14

Page 28: Puppet Camp Berlin 2014: Advanced Puppet Design

A granular moduleclass apache {

$docroot=’/var/www/sites’ $listenaddr=‘10.0.1.10’ $servername=‘myweb.foo.com’ package { ‘httpd’: ensure => installed, }

file { ‘/etc/httpd/httpd.conf’: ensure => file, content => template(‘web/httpd.conf.erb’), }}

Granularity

Friday, 11 April 14

Page 29: Puppet Camp Berlin 2014: Advanced Puppet Design

A granular moduleclass apache {

$docroot=’/var/www/sites’ $listenaddr=‘10.0.1.10’ $servername=‘myweb.foo.com’ package { ‘httpd’: ensure => installed, }

file { ‘/etc/httpd/httpd.conf’: ensure => file, content => template(‘web/httpd.conf.erb’), }}

Granularity

Portability

Friday, 11 April 14

Page 30: Puppet Camp Berlin 2014: Advanced Puppet Design

Sharing is good

• Re-usable by others in your team

• You can publish to the forge!

• People will collaborate

Friday, 11 April 14

Page 31: Puppet Camp Berlin 2014: Advanced Puppet Design

It’s all about sharing!

Friday, 11 April 14

Page 32: Puppet Camp Berlin 2014: Advanced Puppet Design

You are gonna shareyour s**t aren’t you?

Friday, 11 April 14

Page 33: Puppet Camp Berlin 2014: Advanced Puppet Design

Sharing is not justpull requests

• Share your ideas in blog posts

• What worked? What didn’t?

• Discuss and collaborate on mailing lists

• IRC

Friday, 11 April 14

Page 34: Puppet Camp Berlin 2014: Advanced Puppet Design

Making sharing easier

• Data separation (Hiera)

• Allow the user flexibility of implementation

Friday, 11 April 14

Page 35: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults params pattern

• Use a parameterized class

• Default from an inherited class

• Allow the user to decide implementation

Friday, 11 April 14

Page 36: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults patternclass apache { $packagename=‘httpd’ $docroot=’/var/www’ $listenaddr=‘10.0.1.12’ $servername=‘myweb.foo.com’

package { $packagename: ensure => installed, }

.....

Friday, 11 April 14

Page 37: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults patternclass apache { $packagename=‘httpd’ $docroot=’/var/www’ $listenaddr=‘10.0.1.12’ $servername=‘myweb.foo.com’

package { $packagename: ensure => installed, }

.....

In-module private data

No way to override

Friday, 11 April 14

Page 38: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults patternclass apache ( $packagename=‘httpd’, $docroot=’/var/www’, $listenaddr, $servername,) {

package { $packagename: ensure => installed, }

.....

Friday, 11 April 14

Page 39: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults pattern

class { ‘apache’: listenaddr => ‘10.0.1.2’, servername => ‘foo.example.com’,}

Override data on implementation

Friday, 11 April 14

Page 40: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults pattern

# /etc/puppet/hieradata/dev.yaml

---apache::docroot: /var/dev/sites

Overriding from Hiera

Friday, 11 April 14

Page 41: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults patternclass apache::defaults {

$packagename=$::osfamily ? { redhat => ‘httpd’, debian => ‘apache2’, default => ‘httpd’, } $docroot=’/var/www’ $listenaddr = $::ipaddress $servername = $::fqdn}.....

Friday, 11 April 14

Page 42: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults patternclass apache::defaults {

$packagename=$::osfamily ? { redhat => ‘httpd’, debian => ‘apache2’, default => ‘httpd’, } $docroot=’/var/www’ $listenaddr = $::ipaddress $servername = $::fqdn}.....

Added logic todefaults

Common defaults

Friday, 11 April 14

Page 43: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults pattern

class apache ( $packagename=$::apache::defaults::packagename, $docroot=$::apache::defaults::docroot, $listenaddr=$::apache::defaults::listenaddr, $servername=$::apache::defaults::servername,) inherits apache::defaults {

package { $::apache::packagename: ensure => installed, }

.....

Friday, 11 April 14

Page 44: Puppet Camp Berlin 2014: Advanced Puppet Design

defaults pattern

Granularity

Portability

Implementation

Smaller modules with smaller scope

No hard coded data in modules

User can decided how / where to override defaults without editing the module

Friday, 11 April 14

Page 45: Puppet Camp Berlin 2014: Advanced Puppet Design

Component Modules

Friday, 11 April 14

Page 46: Puppet Camp Berlin 2014: Advanced Puppet Design

Now to build something awesome

... but where?

Friday, 11 April 14

Page 47: Puppet Camp Berlin 2014: Advanced Puppet Design

Designing Puppet

Component Modules

Node Classification

Friday, 11 April 14

Page 48: Puppet Camp Berlin 2014: Advanced Puppet Design

Node-level logicnode basil { class { ‘apache’: version => ‘latest’, } class { ‘motd’: } class { ‘ssh’: } class { ‘users’: default_shell => ‘/bin/false’, } Class[‘ssh’] -> Class[‘users’]}

Friday, 11 April 14

Page 49: Puppet Camp Berlin 2014: Advanced Puppet Design

Node-level logic

node basil inherits base { class { ‘apache’: version => ‘latest’, }}

Friday, 11 April 14

Page 50: Puppet Camp Berlin 2014: Advanced Puppet Design

Node-level logic

• Risks duplication and repetition

• No guarantee of consistency

• Pseudo nodes and inheritance trees will get messy, fast.

• TMI!

Friday, 11 April 14

Page 51: Puppet Camp Berlin 2014: Advanced Puppet Design

Thinking beyond the module....

• Puppet is a code base

• You need an effective framework

• Gluing everything together

Friday, 11 April 14

Page 52: Puppet Camp Berlin 2014: Advanced Puppet Design

Introducing Profiles

Friday, 11 April 14

Page 53: Puppet Camp Berlin 2014: Advanced Puppet Design

Profiles

• Wrapper classes implementing component modules

• Define a logical technology stack

• But just one!

Friday, 11 April 14

Page 54: Puppet Camp Berlin 2014: Advanced Puppet Design

Profilesclass profile::blog { User <| group == ‘webadmins’ |> class { ‘::mysql::server’: } class { ‘::mysql::bindings’: php_enable => true, }

class { ‘::wordpress’: install_dir => ‘/var/www/wp’, }}

Friday, 11 April 14

Page 55: Puppet Camp Berlin 2014: Advanced Puppet Design

Profiles

• Component modules manage the resources

• Profiles provide a layer of implementation

Friday, 11 April 14

Page 56: Puppet Camp Berlin 2014: Advanced Puppet Design

Profiles and Components

Resources

Friday, 11 April 14

Page 57: Puppet Camp Berlin 2014: Advanced Puppet Design

Profiles and Components

Resources

Components: Resource modelling

Friday, 11 April 14

Page 58: Puppet Camp Berlin 2014: Advanced Puppet Design

Profiles and Components

Resources

Components: Resource modelling

Profiles : Implementation

Friday, 11 April 14

Page 59: Puppet Camp Berlin 2014: Advanced Puppet Design

Lessons learned

• Granularity is good

• Don’t assume business logic will directly translate to technology

• Abstraction is awesome.... but that’s nothing new....

Friday, 11 April 14

Page 60: Puppet Camp Berlin 2014: Advanced Puppet Design

Abstraction is a core principle of coding

• Implementation is abstracted by methods

• Methods abstracted by classes and modules

• They are abstracted with libraries

• Puppet is code!

Friday, 11 April 14

Page 61: Puppet Camp Berlin 2014: Advanced Puppet Design

Puppet is all about abstraction

• Providers are abstracted by types

• Resources are abstracted by classes

• Classes are abstracted by modules

Friday, 11 April 14

Page 62: Puppet Camp Berlin 2014: Advanced Puppet Design

Puppet is all about abstraction

• Providers are abstracted by types

• Resources are abstracted by classes

• Classes are abstracted by modules

• Modules are abstracted by profiles

Friday, 11 April 14

Page 63: Puppet Camp Berlin 2014: Advanced Puppet Design

Focussing on Abstraction

• We’ve turned business logic into a technology stack

• Can we translate that back into business logic?

• Why would we even want to do that?

Friday, 11 April 14

Page 64: Puppet Camp Berlin 2014: Advanced Puppet Design

Introducing roles

• Translate to business logic

• Identify the function of a server in human terms

• We never said business logic was a bad thing

Friday, 11 April 14

Page 65: Puppet Camp Berlin 2014: Advanced Puppet Design

Configuration model

include profiles::securityinclude profiles::usersinclude profiles::networkinginclude profiles::blog

This is a “acme” server

Friday, 11 April 14

Page 66: Puppet Camp Berlin 2014: Advanced Puppet Design

Think about the usersMeet John, Susan and Bill.

Friday, 11 April 14

Page 67: Puppet Camp Berlin 2014: Advanced Puppet Design

John is a Sysadmin

• Wants to ensure all servers have kernel hardening, NTP and SSH Server installed

• Wants to manage what packages, services, files and other resources

• Is responsible for maintaining all the components of a any type of server

Friday, 11 April 14

Page 68: Puppet Camp Berlin 2014: Advanced Puppet Design

Susan is an application specialist

• Cares that a the node has Wordpress and MySQL implemented properly

• She probably doesn’t care about how sudoers is configured

Friday, 11 April 14

Page 69: Puppet Camp Berlin 2014: Advanced Puppet Design

Bill is an IT manager

• Bill cares that the server is an ACME App server

• He probably doesn’t understand what sudoers is

Friday, 11 April 14

Page 70: Puppet Camp Berlin 2014: Advanced Puppet Design

What do they care about?

• John cares about modelling all resources

• Susan cares about the technology stack

• Bill cares about the business logic

Friday, 11 April 14

Page 71: Puppet Camp Berlin 2014: Advanced Puppet Design

In Puppet

• Resource modelling is done in component modules

• The technology stack is defined in profiles

• Where do we represent the business logic for Bill?

Friday, 11 April 14

Page 72: Puppet Camp Berlin 2014: Advanced Puppet Design

Roles

• Represent business logic, not technology

• Define a set of technology stacks (profiles) that make up the logical role

• Allow the business to manage how the infrastructure looks without defining what it is

Friday, 11 April 14

Page 73: Puppet Camp Berlin 2014: Advanced Puppet Design

A node can only have one role

• A role can include as many profiles as required to define itself

• If a node requires two roles, it has by definition become a new role

Friday, 11 April 14

Page 74: Puppet Camp Berlin 2014: Advanced Puppet Design

A node can only have one role

• A role can include as many profiles as required to define itself

• If a node requires two roles, it has by definition become a new role

• Something couldn’t be a lion and a kangaroo at the same time!

Friday, 11 April 14

Page 75: Puppet Camp Berlin 2014: Advanced Puppet Design

It would be a Lingaroo

Friday, 11 April 14

Page 76: Puppet Camp Berlin 2014: Advanced Puppet Design

Roles

• One-to-one to nodes

• One-to-many to profiles

• Only implement profiles, that’s it!

Friday, 11 April 14

Page 77: Puppet Camp Berlin 2014: Advanced Puppet Design

The Stack

Resources

Friday, 11 April 14

Page 78: Puppet Camp Berlin 2014: Advanced Puppet Design

The Stack

Resources

Components: Resource modelling

Friday, 11 April 14

Page 79: Puppet Camp Berlin 2014: Advanced Puppet Design

The Stack

Resources

Components: Resource modelling

Profiles : Implementation

Friday, 11 April 14

Page 80: Puppet Camp Berlin 2014: Advanced Puppet Design

The Stack

Resources

Components: Resource modelling

Profiles : Implementation

Roles : Business Logic

Friday, 11 April 14

Page 81: Puppet Camp Berlin 2014: Advanced Puppet Design

Role classes

class role::acme { include profiles::security include profiles::users include profiles::networking include profiles::blog}

This is a “acme” server

Friday, 11 April 14

Page 82: Puppet Camp Berlin 2014: Advanced Puppet Design

Terminology

• Profiles and Roles are Puppet modules

• They are not special

• Everything is a module

Friday, 11 April 14

Page 83: Puppet Camp Berlin 2014: Advanced Puppet Design

Classification

• Assigning classes to a node

• You can classify within Puppet code (site.pp)

• You can use an External Node Classifier (ENC)

Friday, 11 April 14

Page 84: Puppet Camp Berlin 2014: Advanced Puppet Design

Classification

• You can classify your nodes however you want

• Puppet Dashboard

• Enterprise Console

• Foreman

• Site.pp

• Custom script

Friday, 11 April 14

Page 85: Puppet Camp Berlin 2014: Advanced Puppet Design

Classification

node ‘craig.puppetlabs.vm’ { include roles::acme_app}

Friday, 11 April 14

Page 86: Puppet Camp Berlin 2014: Advanced Puppet Design

Classification

Friday, 11 April 14

Page 87: Puppet Camp Berlin 2014: Advanced Puppet Design

Classification

• With roles and profiles we just classify the role to the node

Friday, 11 April 14

Page 88: Puppet Camp Berlin 2014: Advanced Puppet Design

The Stack

Resources

Components: Resource modelling

Profiles : Implementation

Roles : Business Logic

Friday, 11 April 14

Page 89: Puppet Camp Berlin 2014: Advanced Puppet Design

The Stack

Resources

Components: Resource modelling

Profiles : Implementation

Roles : Business Logic Classifier

Friday, 11 April 14

Page 90: Puppet Camp Berlin 2014: Advanced Puppet Design

Data Separation

If you’re not using Hiera you are goingto break your data!

Friday, 11 April 14

Page 91: Puppet Camp Berlin 2014: Advanced Puppet Design

Data Separation

• Use parameterized classes

• Hiera data bindings

• Component modules and profiles can look up data from Hiera

• Roles should NOT

Friday, 11 April 14

Page 92: Puppet Camp Berlin 2014: Advanced Puppet Design

Roles and Profilesfor DevOps

• Full props to Laurent Bernaille from D2SI

• Achieving Continuous Delivery and Devops with Puppet

• Puppet Camp Paris, 2014.

Friday, 11 April 14

Page 93: Puppet Camp Berlin 2014: Advanced Puppet Design

Roles and Profilesfor DevOps

• Using roles and profiles makes it easier for developers and ops to all collaborate on Puppet

• Developers write profiles for the their apps

• Ops write profiles for their infrastructure

• Roles encompass all of them

Friday, 11 April 14

Page 94: Puppet Camp Berlin 2014: Advanced Puppet Design

The Roles/ProfilesStack

Resources

Components: Resource modelling

Roles : Business Logic

Hiera:Data

Classifier Classification

Dev profiles Ops profiles

Friday, 11 April 14

Page 95: Puppet Camp Berlin 2014: Advanced Puppet Design

Roles/Profiles/Devopshttp://fr.slideshare.net/D2SI/d2-si-puppetcamp

Friday, 11 April 14

Page 96: Puppet Camp Berlin 2014: Advanced Puppet Design

Key benefits

• Reduced node-level logic to a role.

• Gain the ability to be flexible with implementation

• Business logic improves managability by non-Puppet users

• Edge cases are now easy to solve

Friday, 11 April 14

Page 97: Puppet Camp Berlin 2014: Advanced Puppet Design

Enough Preaching!

Friday, 11 April 14

Page 98: Puppet Camp Berlin 2014: Advanced Puppet Design

This is not the way to design Puppet... It’s a

way.

Friday, 11 April 14

Page 99: Puppet Camp Berlin 2014: Advanced Puppet Design

Can I implement this design without roles?

Friday, 11 April 14

Page 100: Puppet Camp Berlin 2014: Advanced Puppet Design

Can I implement this design without roles?

• Yes.

• You lose the layer of abstraction that exposes business logic

Friday, 11 April 14

Page 101: Puppet Camp Berlin 2014: Advanced Puppet Design

Can my roles be defined in my ENC?

Friday, 11 April 14

Page 102: Puppet Camp Berlin 2014: Advanced Puppet Design

Can my roles be defined in my ENC?

• Yes.

• Keeping it in code makes it versionable

Friday, 11 April 14

Page 103: Puppet Camp Berlin 2014: Advanced Puppet Design

Can’t I just use Hiera to define profiles?

Friday, 11 April 14

Page 104: Puppet Camp Berlin 2014: Advanced Puppet Design

Can’t I just use Hiera to define profiles?

• Technically yes.

• You lose the flexibility to implement code logic in profiles and it may become restrictive

Friday, 11 April 14

Page 105: Puppet Camp Berlin 2014: Advanced Puppet Design

The fundamental concepts....

Friday, 11 April 14

Page 106: Puppet Camp Berlin 2014: Advanced Puppet Design

The fundamental concepts....

• Abstraction, abstraction, abstraction

Friday, 11 April 14

Page 107: Puppet Camp Berlin 2014: Advanced Puppet Design

The fundamental concepts....

• Abstraction, abstraction, abstraction

• Decoupling business logic, implementation and resource modelling.

Friday, 11 April 14

Page 108: Puppet Camp Berlin 2014: Advanced Puppet Design

The fundamental concepts....

• Abstraction, abstraction, abstraction

• Decoupling business logic, implementation and resource modelling.

• Separating data and code

Friday, 11 April 14

Page 109: Puppet Camp Berlin 2014: Advanced Puppet Design

The fundamental concepts....

• Abstraction, abstraction, abstraction

• Decoupling business logic, implementation and resource modelling.

• Separating data and code

• Reducing node-level complexity

Friday, 11 April 14

Page 111: Puppet Camp Berlin 2014: Advanced Puppet Design

Danke. Questions?

• Follow me at @crayfishX

• Bug me on Freenode: crayfishx

In memory of Giles Constant, who spent many nights debating Puppet design patterns with me over copious amounts of beerand helped me on my journey of discovery learning how to implement Puppet properly. R.I.P

Friday, 11 April 14