Designing Puppet: Roles/Profiles Pattern

Puppet
PuppetPuppet
Designing Puppet:
                            Roles / Profiles Design Pattern

                           Puppet Camp Stockholm, Feb 2013




Thursday, 7 February 13
Hello
                     • Craig Dunn
                     • Puppet user since 2008 as an IT contractor
                     • Started with 0.24
                     • Joined Puppet Labs in June 2012
                     • @crayfishX
                     • Freenode IRC: crayfishx
Thursday, 7 February 13
Agenda
                     • How people typically design Puppet
                     • Real-world case study
                     • Thinking about components
                     • Designing Puppet for your users
                     • Node classification
                     • Data separation
Thursday, 7 February 13
Background

                     • Originally a blog post written in May 2012
                     • Advocated by many Puppet Labs Engineers
                     • Based on a real world solution
                     • Several community members have adopted
                          with success



Thursday, 7 February 13
Designing Puppet


                     • You write awesome modules
                     • You classify them to your node


Thursday, 7 February 13
Designing Puppet


                             Node Classification


                                 Modules




Thursday, 7 February 13
Down the road...
                     • Your infrastructure grows
                     • Business requirements will change
                     • Your Puppet code feels bulky and high
                          maintenence
                     • There will always be edge cases eventually
                     • You decide it needs refactoring
Thursday, 7 February 13
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
Thursday, 7 February 13
Write good modules

                     • Should manage only it’s own resources
                     • Should be granular
                     • Should be portable


Thursday, 7 February 13
Thinking beyond the
                               module....

                     • Puppet is a code base
                     • How do I design an effective framework
                     • Gluing everything together


Thursday, 7 February 13
Node-level logic

                     • Risks duplication and repetition
                     • No guarantee of consistency
                     • TMI!


Thursday, 7 February 13
Node-level logic
          node basil {
            class { ‘apache’:
              version => ‘latest’,
            }
            class { ‘motd’: }
            class { ‘ssh’: }
            class { ‘users’:
              default_shell => ‘/bin/false’,
            }
            Class[‘ssh’] -> Class[‘users’]
          }


Thursday, 7 February 13
Node-level logic

                     • What happens when I have 1000 nodes
                     • Or 10,000 nodes!!
                     • That’s a lot of code!
                     • So where should implement this?

Thursday, 7 February 13
Designing Puppet
                     • Provide business logic to classification
                     • Provide an abstraction layer for
                          implementation of components
                     • Make code adaptable to complex
                          requirements
                     • Reduce node-level logic
                     • Reduce functionality overlap
Thursday, 7 February 13
What is the worse
                              thing that is
                          going to happen to
                          your Puppet code?


Thursday, 7 February 13
Business requirements




Thursday, 7 February 13
Business logic does not
                   align with technology



Thursday, 7 February 13
Case study

                     • Real world problem
                     • Solved through design



Thursday, 7 February 13
Case study
                                  “We have 3
                                applications we
                              need to deploy using
                                    Puppet”




Thursday, 7 February 13
The business view


                               Application X



              Application Y                    Application Z



Thursday, 7 February 13
Go forth and
                           Puppetize!


Thursday, 7 February 13
Go forth and
                           Puppetize!
                          And we jumped right in...




Thursday, 7 February 13
Things got painful




Thursday, 7 February 13
Problems
                     • These applications aren’t that different
                     • They seem to share a whole bunch of
                          similarities
                     • Implementation differed on different
                          environments and locations
                     • Writing 3 separate modules creates
                          conflicts and duplication


Thursday, 7 February 13
Our code was hacky




Thursday, 7 February 13
We are trying to code
                        business logic.


Thursday, 7 February 13
Stop thinking about
                            what it looks like

                     • Break everything down into components
                     • Granularity is the key
                     • Think about what it actually is


Thursday, 7 February 13
What we realised


                     • Each application stack is a collection of a
                          subset of the same Java apps implemented
                          in different ways




Thursday, 7 February 13
The business view


                               Application X



              Application Y                    Application Z



Thursday, 7 February 13
The technical reality


                                   Application X


                              ApplicationApplication Z
                                         Y




Thursday, 7 February 13
We only have one
                             application

                          Implemented many
                            different ways
Thursday, 7 February 13
So we had an idea!

                     • Reduce each Java sub application into
                          granular Puppet modules
                     • Create a code layer responsible for
                          implementation
                     • Let’s call them profiles

Thursday, 7 February 13
class profiles::x {
        include tomcat
        include mysql
        include componenta
        include componentb
        componentb::resource { ‘name’:
          ensure => present,
        }
      }

      class profiles::y {
        include tomcat
        include mysql
        include componenta
        include componentc
        include componentd
      }

      class profiles::z {
        include tomcat
        include mysql
        include componenta
        include componentb
        include componentd
        include dependancy
        Class[‘dependancy’] -> Class[‘componentd’]
      }




Thursday, 7 February 13
Use inheritance for abstraction within profiles
     class profiles::application {
       include tomcat
       include mysql
       include componenta
     }

     class profiles::application::x inherits profiles::application {
       include componentb
       componentb::resource { ‘name’:
         ensure => present,
       }
     }

     class profiles::application::y inherits profiles::application {
       include componentc
       include componentd
     }

     class profiles::application::z inherits profiles::application {
       include componentb
       include componentd
       include dependancy
       Class[‘dependancy’] -> Class[‘componentd’]
     }



Thursday, 7 February 13
Profiles and
                          Components




                             Resources
Thursday, 7 February 13
Profiles and
                             Components



                          Components: Resource modelling


                                    Resources
Thursday, 7 February 13
Profiles and
                             Components

                              Profiles : Implementation


                          Components: Resource modelling


                                    Resources
Thursday, 7 February 13
In reality it was worse




Thursday, 7 February 13
In reality it was worse
                     • 2 different deployment types made up of
                          over 15 server types each




Thursday, 7 February 13
In reality it was worse
                     • 2 different deployment types made up of
                          over 15 server types each
                     • 10+ locations




Thursday, 7 February 13
In reality it was worse
                     • 2 different deployment types made up of
                          over 15 server types each
                     • 10+ locations
                     • 4 environment types



Thursday, 7 February 13
In reality it was worse
                     • 2 different deployment types made up of
                          over 15 server types each
                     • 10+ locations
                     • 4 environment types
                     • Every installation was an edge case!


Thursday, 7 February 13
In reality it was worse
                     • 2 different deployment types made up of
                          over 15 server types each
                     • 10+ locations
                     • 4 environment types
                     • Every installation was an edge case!
                     • My slides weren’t big enough.

Thursday, 7 February 13
Lessons learned

                     • Granularity is good
                     • Don’t assume business logic will directly
                          translate to technology
                     • Abstraction is awesome.... but that’s
                          nothing new....



Thursday, 7 February 13
Abstraction is a core
                           principle of coding
                     • Functions are abstracted by methods
                     • Methods abstracted by classes and modules
                     • They are abstracted with libraries
                     • Puppet is code!

Thursday, 7 February 13
Puppet is all about
                             abstraction
                     • Data is abstracted by Hiera
                     • Providers are abstracted by types
                     • Resources are abstracted by classes
                     • Classes are abstracted by modules

Thursday, 7 February 13
Puppet is all about
                             abstraction
                     • Data is abstracted by Hiera
                     • Providers are abstracted by types
                     • Resources are abstracted by classes
                     • Classes are abstracted by modules
                     • Modules are abstracted by profiles
Thursday, 7 February 13
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?

Thursday, 7 February 13
UAT Cluster node
                          Our example configuration model:

                              include   security
                              include   users
                              include   ntp
                              include   ssh::server
                              include   customapp
                              include   tomcat::server

                              class { ‘jenkins’:
                                require => Class[‘tomcat::server’],
                              }

                              include mysql
                              database { ‘apptest’:
                                ensure => present,
                              }




Thursday, 7 February 13
Think about the users
                          Meet John, Susan and Bill.




Thursday, 7 February 13
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 UAT cluster server



Thursday, 7 February 13
Susan is an application
                             specialist

                     • Cares that a UAT Cluster node requires
                          MySQL Server, Tomcat Server and Jenkins
                          server installed.




Thursday, 7 February 13
Bill is an IT manager


                     • Bill cares that the server is a UAT Cluster
                          node




Thursday, 7 February 13
What do they care
                               about?

                     • John cares about modelling all resources
                     • Susan cares about the technology stack
                     • Bill cares about the business logic


Thursday, 7 February 13
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?



Thursday, 7 February 13
Introducing 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



Thursday, 7 February 13
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




Thursday, 7 February 13
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!




Thursday, 7 February 13
It would be a Lingaroo




Thursday, 7 February 13
Roles

                     • One-to-one to nodes
                     • One-to-many to profiles
                     • Only implement profiles


Thursday, 7 February 13
Example role
                class role::uat_server {
                  include profiles::base
                  include profiles::customapp
                  include profiles::test_tools
                }




Thursday, 7 February 13
Classification


                     • Node classification simply assigns roles to
                          nodes
                     • Roles expose profiles


Thursday, 7 February 13
Classification

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




Thursday, 7 February 13
Classification




Thursday, 7 February 13
The Stack




                            Resources
Thursday, 7 February 13
The Stack



                          Components: Resource modelling


                                    Resources
Thursday, 7 February 13
The Stack


                              Profiles : Implementation


                          Components: Resource modelling


                                    Resources
Thursday, 7 February 13
The Stack
                               Roles : Business Logic


                              Profiles : Implementation


                          Components: Resource modelling


                                    Resources
Thursday, 7 February 13
Terminology

                     • Profiles and Roles are Puppet modules
                     • Components are Puppet modules
                          responsible for modelling resources
                     • Everything is a module


Thursday, 7 February 13
Naming conventions
                     • Components should be named after what
                          they manage (apache, ssh, mysql)
                     • Profiles should be named after the logical
                          stack they implement (database, bastion,
                          email)
                     • Roles should be named in business logic
                          convention (uat_server, web_cluster,
                          application, archive)


Thursday, 7 February 13
Hiera Overview
                            Let’s talk about data!




Thursday, 7 February 13
Managing infrastructure

                          Dev




Thursday, 7 February 13
Managing infrastructure

                          Dev

                          QA




Thursday, 7 February 13
Managing infrastructure

                             Dev

                             QA

                          Production




Thursday, 7 February 13
Managing infrastructure

                             Dev

                             QA        DC1

                          Production




Thursday, 7 February 13
Managing infrastructure

                             Dev

                             QA        DC1   DC2   DC3

                          Production




Thursday, 7 February 13
Managing data in
                          Puppet is hard.




Thursday, 7 February 13
Without Hiera?
                          if ( $::environment == ‘dev’ ) {
                            $ntpserver = ‘192.168.2.1’
                          } else {
                            if ( $::fqdn == ‘host4.mycorp.com’) {
                              $ntpserver = ‘127.0.0.1’
                            } else {
                              $ntpserver = ‘213.21.6.4’
                            }
                          }




Thursday, 7 February 13
With Hiera?
                          $ntpserver = hiera(‘ntpserver’)




Thursday, 7 February 13
Hierarchical lookups

                     • Hiera uses facter facts to determine a
                          hierarchy
                     • Top down hierarchy for overriding
                          configuration values based on roles,
                          environments, locations.... or anything else
                     • And do this without any coding!

Thursday, 7 February 13
Separation of data from code


                     • Puppet modules without hard-coded data
                          are easily shared and more re-usable
                     • Infrastructure configuration can be
                          managed without needing to edit Puppet
                          code




Thursday, 7 February 13
Pluggable Backends
                     • Source data from multiple locations
                     • Data source is abstracted from code




Thursday, 7 February 13
Pluggable Backends
                     • Source data from multiple locations
                     • Data source is abstracted from code
                          • hiera-gpg     • hiera-redis
                          • hiera-http    • hiera-json
                          • hiera-mysql   • hiera-zookeeper

Thursday, 7 February 13
Data Separation

                     • Use Hiera to abstract your data from your
                          code
                     • Components and profiles can source data
                          from Hiera




Thursday, 7 February 13
Profiles and Hiera


                     • Use Hiera to model your data
                     • Use profiles to model your implementation


Thursday, 7 February 13
The Stack
                      Roles : Business Logic


                  Profiles : Implementation


   Components: Resource modelling


                           Resources

Thursday, 7 February 13
The Stack
                      Roles : Business Logic


                  Profiles : Implementation
                                               Hiera:
                                               Data
   Components: Resource modelling


                           Resources

Thursday, 7 February 13
Classification

                     • Assigning classes to a node
                     • You can classify within Puppet code
                          (site.pp)
                     • You can use an External Node Classifier
                          (ENC)



Thursday, 7 February 13
Leveraging an ENC
                     • You can classify your nodes however you
                          want
                          • Puppet Dashboard
                          • Enterprise Console
                          • Foreman
                          • Site.pp
                          • Custom script
Thursday, 7 February 13
Leveraging an ENC


                     • An ENC should classify a node to it’s role
                     • Nothing else


Thursday, 7 February 13
The Stack
                      Roles : Business Logic


                  Profiles : Implementation
                                               Hiera:
                                               Data
   Components: Resource modelling


                           Resources

Thursday, 7 February 13
The Stack
                      Roles : Business Logic   Classifier


                  Profiles : Implementation
                                                Hiera:
                                                Data
   Components: Resource modelling


                           Resources

Thursday, 7 February 13
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

Thursday, 7 February 13
Enough Preaching!




Thursday, 7 February 13
This is not the way to
                          design Puppet... It’s a
                                   way.


Thursday, 7 February 13
Can I implement this
                          design without roles?




Thursday, 7 February 13
Can I implement this
                          design without roles?

                     • Yes.
                     • You lose the layer of abstraction that
                          exposes business logic




Thursday, 7 February 13
Can my roles be
                          defined in my ENC?




Thursday, 7 February 13
Can my roles be
                          defined in my ENC?

                     • Yes.
                     • Keeping it in code makes it versionable


Thursday, 7 February 13
Can’t I just use Hiera
                           to define profiles?




Thursday, 7 February 13
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
                     • You could possibly use: https://github.com/
                          ripienaar/hiera-puppet-nodes



Thursday, 7 February 13
The fundamental
                            concepts....




Thursday, 7 February 13
The fundamental
                            concepts....

                     • Abstraction, abstraction, abstraction




Thursday, 7 February 13
The fundamental
                               concepts....

                     • Abstraction, abstraction, abstraction
                     • Decoupling business logic, implementation
                          and resource modelling.




Thursday, 7 February 13
The fundamental
                               concepts....

                     • Abstraction, abstraction, abstraction
                     • Decoupling business logic, implementation
                          and resource modelling.
                     • Separating data and code

Thursday, 7 February 13
The fundamental
                               concepts....

                     • Abstraction, abstraction, abstraction
                     • Decoupling business logic, implementation
                          and resource modelling.
                     • Separating data and code
                     • Reducing node-level complexity
Thursday, 7 February 13
Other Resources

                     • Adrien Thebos’ excellent blog post                           http://
                          sysadvent.blogspot.co.uk/2012/12/day-13-configuration-management-as-
                          legos.html


                     • My original blog post
                          2012/05/239/
                                                             http://www.craigdunn.org/



                     • Module Structure Redux by R.I.Pienaar                              http://
                          www.devco.net/archives/2012/12/13/simple-puppet-module-structure-
                          redux.php




Thursday, 7 February 13
Thank you. Questions?


                     • Follow me at @crayfishX
                     • Bug me on Freenode: crayfishx
                                Enjoy the rest of Puppet Camp!
        In memory of Giles Constant, who spent many nights debating Puppet design patterns with me over copious amounts of beer
                       and helped me on my journey of discovery learning how to implement Puppet properly. R.I.P

Thursday, 7 February 13
1 of 108

Recommended

10+ Deploys Per Day: Dev and Ops Cooperation at Flickr by
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at FlickrJohn Allspaw
1M views78 slides
DX 時代の新たなソフトウェア工学に向けて: SWEBOK と SE4BS の挑戦 by
DX 時代の新たなソフトウェア工学に向けて: SWEBOK と SE4BS の挑戦DX 時代の新たなソフトウェア工学に向けて: SWEBOK と SE4BS の挑戦
DX 時代の新たなソフトウェア工学に向けて: SWEBOK と SE4BS の挑戦Hironori Washizaki
1.8K views31 slides
Azure API Management by
Azure API ManagementAzure API Management
Azure API ManagementDaniel Toomey
5.2K views36 slides
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech by
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techConsumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techToshiaki Maki
5.2K views39 slides
Kong Enterprise の紹介 by
Kong Enterprise の紹介Kong Enterprise の紹介
Kong Enterprise の紹介Yoshito Tabuchi
856 views28 slides
SharePoint Framework をはじめよう #spfx by
SharePoint Framework をはじめよう #spfxSharePoint Framework をはじめよう #spfx
SharePoint Framework をはじめよう #spfxHirofumi Ota
5.5K views51 slides

More Related Content

What's hot

Developing applications with a microservice architecture (SVforum, microservi... by
Developing applications with a microservice architecture (SVforum, microservi...Developing applications with a microservice architecture (SVforum, microservi...
Developing applications with a microservice architecture (SVforum, microservi...Chris Richardson
168.7K views97 slides
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術 by
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術Unity Technologies Japan K.K.
186.1K views89 slides
PlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 OSAKA by
PlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 OSAKAPlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 OSAKA
PlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 OSAKAGame Tools & Middleware Forum
1.4K views68 slides
Unity対応してるmbass全部紹介する by
Unity対応してるmbass全部紹介するUnity対応してるmbass全部紹介する
Unity対応してるmbass全部紹介するTakaaki Ichijo
10.2K views32 slides
ゲームの中の人工知能 by
ゲームの中の人工知能ゲームの中の人工知能
ゲームの中の人工知能Youichiro Miyake
44.7K views257 slides
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー by
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーYoshifumi Kawai
42.9K views37 slides

What's hot(20)

Developing applications with a microservice architecture (SVforum, microservi... by Chris Richardson
Developing applications with a microservice architecture (SVforum, microservi...Developing applications with a microservice architecture (SVforum, microservi...
Developing applications with a microservice architecture (SVforum, microservi...
Chris Richardson168.7K views
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術 by Unity Technologies Japan K.K.
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
PlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 OSAKA by Game Tools & Middleware Forum
PlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 OSAKAPlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 OSAKA
PlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 OSAKA
Unity対応してるmbass全部紹介する by Takaaki Ichijo
Unity対応してるmbass全部紹介するUnity対応してるmbass全部紹介する
Unity対応してるmbass全部紹介する
Takaaki Ichijo10.2K views
ゲームの中の人工知能 by Youichiro Miyake
ゲームの中の人工知能ゲームの中の人工知能
ゲームの中の人工知能
Youichiro Miyake44.7K views
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー by Yoshifumi Kawai
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai42.9K views
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】 by DeNA
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
DeNA1.8K views
PHP Version Up と AWS への移行 by gree_tech
PHP Version Up と AWS への移行PHP Version Up と AWS への移行
PHP Version Up と AWS への移行
gree_tech7.6K views
エンジニアから飛んでくるマサカリを受け止める心得 by Reimi Kuramochi Chiba
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得
Reimi Kuramochi Chiba64.4K views
Nessusをちょっと深堀してみた by Kazumasa Sasazawa
Nessusをちょっと深堀してみたNessusをちょっと深堀してみた
Nessusをちょっと深堀してみた
Kazumasa Sasazawa4.1K views
なぜ「マイクロサービス“化”」が必要なのか by Yusuke Suzuki
なぜ「マイクロサービス“化”」が必要なのかなぜ「マイクロサービス“化”」が必要なのか
なぜ「マイクロサービス“化”」が必要なのか
Yusuke Suzuki28K views
Apache Sedona Community Call slides Part 1 by JiaYu45
Apache Sedona Community Call slides Part 1Apache Sedona Community Call slides Part 1
Apache Sedona Community Call slides Part 1
JiaYu45115 views
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた by Kohei Kadowaki
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
Kohei Kadowaki48.1K views
ReactとSeleniumの幸せな関係 by Akira Kuratani
ReactとSeleniumの幸せな関係ReactとSeleniumの幸せな関係
ReactとSeleniumの幸せな関係
Akira Kuratani7.1K views
ドメイン駆動設計の正しい歩き方 by 増田 亨
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
増田 亨25.3K views
建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】 by Unity Technologies Japan K.K.
建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】
建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜 by TIS Inc.
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
TIS Inc.3.9K views
GCP・GKEで作るスケーラブルなゲーム開発環境 by Yasutomo Uemori
GCP・GKEで作るスケーラブルなゲーム開発環境GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境
Yasutomo Uemori5.2K views
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話 by Yuhei Miyazato
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
Yuhei Miyazato16.4K views

Viewers also liked

UPDATED SOCCSKSARGEN Regional Development Plan, 2013-2016 by
UPDATED SOCCSKSARGEN Regional Development Plan, 2013-2016UPDATED SOCCSKSARGEN Regional Development Plan, 2013-2016
UPDATED SOCCSKSARGEN Regional Development Plan, 2013-2016National Economic and Development Authority XII
8.4K views148 slides
SOCCSKSARGEN Regional Development Report 2016 by
SOCCSKSARGEN Regional Development Report 2016SOCCSKSARGEN Regional Development Report 2016
SOCCSKSARGEN Regional Development Report 2016National Economic and Development Authority XII
3.9K views87 slides
Regional Physical Framework Plan, 2004 2030 of SOCCSKSARGEN by
Regional Physical Framework Plan, 2004 2030 of SOCCSKSARGENRegional Physical Framework Plan, 2004 2030 of SOCCSKSARGEN
Regional Physical Framework Plan, 2004 2030 of SOCCSKSARGENNational Economic and Development Authority XII
4.3K views54 slides
Region IV-B Mimaropa Geography by
Region IV-B Mimaropa GeographyRegion IV-B Mimaropa Geography
Region IV-B Mimaropa GeographyLyn Gile Facebook
40.7K views156 slides
Building construction-report (1) by
Building construction-report (1)Building construction-report (1)
Building construction-report (1)Soh Shing
140.8K views44 slides
Region x northern mindanao by
Region x  northern mindanaoRegion x  northern mindanao
Region x northern mindanaoJaylyn Geronimo
98.9K views40 slides

Similar to Designing Puppet: Roles/Profiles Pattern

Intro to BAScene framework for Mac by
Intro to BAScene framework for MacIntro to BAScene framework for Mac
Intro to BAScene framework for Macbgulanowski
374 views38 slides
5 Of Our Favorite Ruby Gems by
5 Of Our Favorite Ruby Gems5 Of Our Favorite Ruby Gems
5 Of Our Favorite Ruby GemsDan Pickett
1K views25 slides
State of Puppet by
State of PuppetState of Puppet
State of PuppetPuppet
824 views43 slides
Cloud4all Architecture Overview by
Cloud4all Architecture OverviewCloud4all Architecture Overview
Cloud4all Architecture Overviewicchp2012
665 views37 slides
Distributed Fuzzing Framework Design by
Distributed Fuzzing Framework DesignDistributed Fuzzing Framework Design
Distributed Fuzzing Framework Designbannedit
1.4K views18 slides
Smalltalk and ruby - 2012-12-08 by
Smalltalk and ruby  - 2012-12-08Smalltalk and ruby  - 2012-12-08
Smalltalk and ruby - 2012-12-08Koan-Sin Tan
1.8K views59 slides

Similar to Designing Puppet: Roles/Profiles Pattern(20)

Intro to BAScene framework for Mac by bgulanowski
Intro to BAScene framework for MacIntro to BAScene framework for Mac
Intro to BAScene framework for Mac
bgulanowski374 views
5 Of Our Favorite Ruby Gems by Dan Pickett
5 Of Our Favorite Ruby Gems5 Of Our Favorite Ruby Gems
5 Of Our Favorite Ruby Gems
Dan Pickett1K views
State of Puppet by Puppet
State of PuppetState of Puppet
State of Puppet
Puppet824 views
Cloud4all Architecture Overview by icchp2012
Cloud4all Architecture OverviewCloud4all Architecture Overview
Cloud4all Architecture Overview
icchp2012665 views
Distributed Fuzzing Framework Design by bannedit
Distributed Fuzzing Framework DesignDistributed Fuzzing Framework Design
Distributed Fuzzing Framework Design
bannedit1.4K views
Smalltalk and ruby - 2012-12-08 by Koan-Sin Tan
Smalltalk and ruby  - 2012-12-08Smalltalk and ruby  - 2012-12-08
Smalltalk and ruby - 2012-12-08
Koan-Sin Tan1.8K views
GitHub Notable OSS Project by roumia
GitHub  Notable OSS ProjectGitHub  Notable OSS Project
GitHub Notable OSS Project
roumia415 views
Introduction to Node.js by Troy Miles
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
Troy Miles860 views
Puppet @ Nedap by Puppet
Puppet @ NedapPuppet @ Nedap
Puppet @ Nedap
Puppet1.4K views
Writing Reusable Web Components with jQuery and jQuery UI by Ynon Perek
Writing Reusable Web Components with jQuery and jQuery UIWriting Reusable Web Components with jQuery and jQuery UI
Writing Reusable Web Components with jQuery and jQuery UI
Ynon Perek20.2K views
JavaOne 2012, OSGi for the Earthlings: Meet Eclipse Libra by Murat Yener
JavaOne 2012, OSGi for the Earthlings: Meet Eclipse LibraJavaOne 2012, OSGi for the Earthlings: Meet Eclipse Libra
JavaOne 2012, OSGi for the Earthlings: Meet Eclipse Libra
Murat Yener823 views
Enterprise javascriptsession1 by Troy Miles
Enterprise javascriptsession1Enterprise javascriptsession1
Enterprise javascriptsession1
Troy Miles596 views
Launching Mixer: What Worked, What didn't by Chris Connell
Launching Mixer: What Worked, What didn'tLaunching Mixer: What Worked, What didn't
Launching Mixer: What Worked, What didn't
Chris Connell251 views
Scaling Puppet Usage to a Global Organization by Puppet
Scaling Puppet Usage to a Global OrganizationScaling Puppet Usage to a Global Organization
Scaling Puppet Usage to a Global Organization
Puppet1.6K views
99 inception-deck by drewz lin
99 inception-deck99 inception-deck
99 inception-deck
drewz lin20K views

More from Puppet

Puppet camp2021 testing modules and controlrepo by
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet
1.5K views41 slides
Puppetcamp r10kyaml by
Puppetcamp r10kyamlPuppetcamp r10kyaml
Puppetcamp r10kyamlPuppet
192 views10 slides
2021 04-15 operational verification (with notes) by
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)Puppet
148 views14 slides
Puppet camp vscode by
Puppet camp vscodePuppet camp vscode
Puppet camp vscodePuppet
148 views4 slides
Modules of the twenties by
Modules of the twentiesModules of the twenties
Modules of the twentiesPuppet
848 views27 slides
Applying Roles and Profiles method to compliance code by
Applying Roles and Profiles method to compliance codeApplying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codePuppet
213 views17 slides

More from Puppet(20)

Puppet camp2021 testing modules and controlrepo by Puppet
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepo
Puppet1.5K views
Puppetcamp r10kyaml by Puppet
Puppetcamp r10kyamlPuppetcamp r10kyaml
Puppetcamp r10kyaml
Puppet192 views
2021 04-15 operational verification (with notes) by Puppet
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)
Puppet148 views
Puppet camp vscode by Puppet
Puppet camp vscodePuppet camp vscode
Puppet camp vscode
Puppet148 views
Modules of the twenties by Puppet
Modules of the twentiesModules of the twenties
Modules of the twenties
Puppet848 views
Applying Roles and Profiles method to compliance code by Puppet
Applying Roles and Profiles method to compliance codeApplying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance code
Puppet213 views
KGI compliance as-code approach by Puppet
KGI compliance as-code approachKGI compliance as-code approach
KGI compliance as-code approach
Puppet159 views
Enforce compliance policy with model-driven automation by Puppet
Enforce compliance policy with model-driven automationEnforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automation
Puppet181 views
Keynote: Puppet camp compliance by Puppet
Keynote: Puppet camp complianceKeynote: Puppet camp compliance
Keynote: Puppet camp compliance
Puppet159 views
Automating it management with Puppet + ServiceNow by Puppet
Automating it management with Puppet + ServiceNowAutomating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNow
Puppet555 views
Puppet: The best way to harden Windows by Puppet
Puppet: The best way to harden WindowsPuppet: The best way to harden Windows
Puppet: The best way to harden Windows
Puppet364 views
Simplified Patch Management with Puppet - Oct. 2020 by Puppet
Simplified Patch Management with Puppet - Oct. 2020Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020
Puppet342 views
Accelerating azure adoption with puppet by Puppet
Accelerating azure adoption with puppetAccelerating azure adoption with puppet
Accelerating azure adoption with puppet
Puppet241 views
Puppet catalog Diff; Raphael Pinson by Puppet
Puppet catalog Diff; Raphael PinsonPuppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael Pinson
Puppet215 views
ServiceNow and Puppet- better together, Kevin Reeuwijk by Puppet
ServiceNow and Puppet- better together, Kevin ReeuwijkServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin Reeuwijk
Puppet248 views
Take control of your dev ops dumping ground by Puppet
Take control of your  dev ops dumping groundTake control of your  dev ops dumping ground
Take control of your dev ops dumping ground
Puppet246 views
100% Puppet Cloud Deployment of Legacy Software by Puppet
100% Puppet Cloud Deployment of Legacy Software100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software
Puppet188 views
Puppet User Group by Puppet
Puppet User GroupPuppet User Group
Puppet User Group
Puppet196 views
Continuous Compliance and DevSecOps by Puppet
Continuous Compliance and DevSecOpsContinuous Compliance and DevSecOps
Continuous Compliance and DevSecOps
Puppet259 views
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy by Puppet
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyThe Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
Puppet240 views

Recently uploaded

State of the Union - Rohit Yadav - Apache CloudStack by
State of the Union - Rohit Yadav - Apache CloudStackState of the Union - Rohit Yadav - Apache CloudStack
State of the Union - Rohit Yadav - Apache CloudStackShapeBlue
218 views53 slides
"Surviving highload with Node.js", Andrii Shumada by
"Surviving highload with Node.js", Andrii Shumada "Surviving highload with Node.js", Andrii Shumada
"Surviving highload with Node.js", Andrii Shumada Fwdays
49 views29 slides
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava... by
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...ShapeBlue
74 views17 slides
Digital Personal Data Protection (DPDP) Practical Approach For CISOs by
Digital Personal Data Protection (DPDP) Practical Approach For CISOsDigital Personal Data Protection (DPDP) Practical Approach For CISOs
Digital Personal Data Protection (DPDP) Practical Approach For CISOsPriyanka Aash
103 views59 slides
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P... by
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...ShapeBlue
120 views62 slides
Network Source of Truth and Infrastructure as Code revisited by
Network Source of Truth and Infrastructure as Code revisitedNetwork Source of Truth and Infrastructure as Code revisited
Network Source of Truth and Infrastructure as Code revisitedNetwork Automation Forum
49 views45 slides

Recently uploaded(20)

State of the Union - Rohit Yadav - Apache CloudStack by ShapeBlue
State of the Union - Rohit Yadav - Apache CloudStackState of the Union - Rohit Yadav - Apache CloudStack
State of the Union - Rohit Yadav - Apache CloudStack
ShapeBlue218 views
"Surviving highload with Node.js", Andrii Shumada by Fwdays
"Surviving highload with Node.js", Andrii Shumada "Surviving highload with Node.js", Andrii Shumada
"Surviving highload with Node.js", Andrii Shumada
Fwdays49 views
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava... by ShapeBlue
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
ShapeBlue74 views
Digital Personal Data Protection (DPDP) Practical Approach For CISOs by Priyanka Aash
Digital Personal Data Protection (DPDP) Practical Approach For CISOsDigital Personal Data Protection (DPDP) Practical Approach For CISOs
Digital Personal Data Protection (DPDP) Practical Approach For CISOs
Priyanka Aash103 views
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P... by ShapeBlue
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
ShapeBlue120 views
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R... by ShapeBlue
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
ShapeBlue105 views
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda... by ShapeBlue
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
ShapeBlue93 views
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
ShapeBlue149 views
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool by ShapeBlue
Extending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPoolExtending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPool
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool
ShapeBlue56 views
Confidence in CloudStack - Aron Wagner, Nathan Gleason - Americ by ShapeBlue
Confidence in CloudStack - Aron Wagner, Nathan Gleason - AmericConfidence in CloudStack - Aron Wagner, Nathan Gleason - Americ
Confidence in CloudStack - Aron Wagner, Nathan Gleason - Americ
ShapeBlue58 views
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or... by ShapeBlue
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
ShapeBlue128 views
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue by ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueVNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
ShapeBlue134 views
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by ShapeBlue
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
ShapeBlue52 views
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
ShapeBlue63 views
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue by ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlueMigrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
ShapeBlue147 views
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha... by ShapeBlue
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
ShapeBlue113 views

Designing Puppet: Roles/Profiles Pattern

  • 1. Designing Puppet: Roles / Profiles Design Pattern Puppet Camp Stockholm, Feb 2013 Thursday, 7 February 13
  • 2. Hello • Craig Dunn • Puppet user since 2008 as an IT contractor • Started with 0.24 • Joined Puppet Labs in June 2012 • @crayfishX • Freenode IRC: crayfishx Thursday, 7 February 13
  • 3. Agenda • How people typically design Puppet • Real-world case study • Thinking about components • Designing Puppet for your users • Node classification • Data separation Thursday, 7 February 13
  • 4. Background • Originally a blog post written in May 2012 • Advocated by many Puppet Labs Engineers • Based on a real world solution • Several community members have adopted with success Thursday, 7 February 13
  • 5. Designing Puppet • You write awesome modules • You classify them to your node Thursday, 7 February 13
  • 6. Designing Puppet Node Classification Modules Thursday, 7 February 13
  • 7. Down the road... • Your infrastructure grows • Business requirements will change • Your Puppet code feels bulky and high maintenence • There will always be edge cases eventually • You decide it needs refactoring Thursday, 7 February 13
  • 8. 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 Thursday, 7 February 13
  • 9. Write good modules • Should manage only it’s own resources • Should be granular • Should be portable Thursday, 7 February 13
  • 10. Thinking beyond the module.... • Puppet is a code base • How do I design an effective framework • Gluing everything together Thursday, 7 February 13
  • 11. Node-level logic • Risks duplication and repetition • No guarantee of consistency • TMI! Thursday, 7 February 13
  • 12. Node-level logic node basil { class { ‘apache’: version => ‘latest’, } class { ‘motd’: } class { ‘ssh’: } class { ‘users’: default_shell => ‘/bin/false’, } Class[‘ssh’] -> Class[‘users’] } Thursday, 7 February 13
  • 13. Node-level logic • What happens when I have 1000 nodes • Or 10,000 nodes!! • That’s a lot of code! • So where should implement this? Thursday, 7 February 13
  • 14. Designing Puppet • Provide business logic to classification • Provide an abstraction layer for implementation of components • Make code adaptable to complex requirements • Reduce node-level logic • Reduce functionality overlap Thursday, 7 February 13
  • 15. What is the worse thing that is going to happen to your Puppet code? Thursday, 7 February 13
  • 17. Business logic does not align with technology Thursday, 7 February 13
  • 18. Case study • Real world problem • Solved through design Thursday, 7 February 13
  • 19. Case study “We have 3 applications we need to deploy using Puppet” Thursday, 7 February 13
  • 20. The business view Application X Application Y Application Z Thursday, 7 February 13
  • 21. Go forth and Puppetize! Thursday, 7 February 13
  • 22. Go forth and Puppetize! And we jumped right in... Thursday, 7 February 13
  • 24. Problems • These applications aren’t that different • They seem to share a whole bunch of similarities • Implementation differed on different environments and locations • Writing 3 separate modules creates conflicts and duplication Thursday, 7 February 13
  • 25. Our code was hacky Thursday, 7 February 13
  • 26. We are trying to code business logic. Thursday, 7 February 13
  • 27. Stop thinking about what it looks like • Break everything down into components • Granularity is the key • Think about what it actually is Thursday, 7 February 13
  • 28. What we realised • Each application stack is a collection of a subset of the same Java apps implemented in different ways Thursday, 7 February 13
  • 29. The business view Application X Application Y Application Z Thursday, 7 February 13
  • 30. The technical reality Application X ApplicationApplication Z Y Thursday, 7 February 13
  • 31. We only have one application Implemented many different ways Thursday, 7 February 13
  • 32. So we had an idea! • Reduce each Java sub application into granular Puppet modules • Create a code layer responsible for implementation • Let’s call them profiles Thursday, 7 February 13
  • 33. class profiles::x { include tomcat include mysql include componenta include componentb componentb::resource { ‘name’: ensure => present, } } class profiles::y { include tomcat include mysql include componenta include componentc include componentd } class profiles::z { include tomcat include mysql include componenta include componentb include componentd include dependancy Class[‘dependancy’] -> Class[‘componentd’] } Thursday, 7 February 13
  • 34. Use inheritance for abstraction within profiles class profiles::application { include tomcat include mysql include componenta } class profiles::application::x inherits profiles::application { include componentb componentb::resource { ‘name’: ensure => present, } } class profiles::application::y inherits profiles::application { include componentc include componentd } class profiles::application::z inherits profiles::application { include componentb include componentd include dependancy Class[‘dependancy’] -> Class[‘componentd’] } Thursday, 7 February 13
  • 35. Profiles and Components Resources Thursday, 7 February 13
  • 36. Profiles and Components Components: Resource modelling Resources Thursday, 7 February 13
  • 37. Profiles and Components Profiles : Implementation Components: Resource modelling Resources Thursday, 7 February 13
  • 38. In reality it was worse Thursday, 7 February 13
  • 39. In reality it was worse • 2 different deployment types made up of over 15 server types each Thursday, 7 February 13
  • 40. In reality it was worse • 2 different deployment types made up of over 15 server types each • 10+ locations Thursday, 7 February 13
  • 41. In reality it was worse • 2 different deployment types made up of over 15 server types each • 10+ locations • 4 environment types Thursday, 7 February 13
  • 42. In reality it was worse • 2 different deployment types made up of over 15 server types each • 10+ locations • 4 environment types • Every installation was an edge case! Thursday, 7 February 13
  • 43. In reality it was worse • 2 different deployment types made up of over 15 server types each • 10+ locations • 4 environment types • Every installation was an edge case! • My slides weren’t big enough. Thursday, 7 February 13
  • 44. Lessons learned • Granularity is good • Don’t assume business logic will directly translate to technology • Abstraction is awesome.... but that’s nothing new.... Thursday, 7 February 13
  • 45. Abstraction is a core principle of coding • Functions are abstracted by methods • Methods abstracted by classes and modules • They are abstracted with libraries • Puppet is code! Thursday, 7 February 13
  • 46. Puppet is all about abstraction • Data is abstracted by Hiera • Providers are abstracted by types • Resources are abstracted by classes • Classes are abstracted by modules Thursday, 7 February 13
  • 47. Puppet is all about abstraction • Data is abstracted by Hiera • Providers are abstracted by types • Resources are abstracted by classes • Classes are abstracted by modules • Modules are abstracted by profiles Thursday, 7 February 13
  • 48. 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? Thursday, 7 February 13
  • 49. UAT Cluster node Our example configuration model: include security include users include ntp include ssh::server include customapp include tomcat::server class { ‘jenkins’: require => Class[‘tomcat::server’], } include mysql database { ‘apptest’: ensure => present, } Thursday, 7 February 13
  • 50. Think about the users Meet John, Susan and Bill. Thursday, 7 February 13
  • 51. 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 UAT cluster server Thursday, 7 February 13
  • 52. Susan is an application specialist • Cares that a UAT Cluster node requires MySQL Server, Tomcat Server and Jenkins server installed. Thursday, 7 February 13
  • 53. Bill is an IT manager • Bill cares that the server is a UAT Cluster node Thursday, 7 February 13
  • 54. What do they care about? • John cares about modelling all resources • Susan cares about the technology stack • Bill cares about the business logic Thursday, 7 February 13
  • 55. 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? Thursday, 7 February 13
  • 56. Introducing 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 Thursday, 7 February 13
  • 57. 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 Thursday, 7 February 13
  • 58. 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! Thursday, 7 February 13
  • 59. It would be a Lingaroo Thursday, 7 February 13
  • 60. Roles • One-to-one to nodes • One-to-many to profiles • Only implement profiles Thursday, 7 February 13
  • 61. Example role class role::uat_server { include profiles::base include profiles::customapp include profiles::test_tools } Thursday, 7 February 13
  • 62. Classification • Node classification simply assigns roles to nodes • Roles expose profiles Thursday, 7 February 13
  • 63. Classification node ‘craig.puppetlabs.vm’ { include roles::uat_server } Thursday, 7 February 13
  • 65. The Stack Resources Thursday, 7 February 13
  • 66. The Stack Components: Resource modelling Resources Thursday, 7 February 13
  • 67. The Stack Profiles : Implementation Components: Resource modelling Resources Thursday, 7 February 13
  • 68. The Stack Roles : Business Logic Profiles : Implementation Components: Resource modelling Resources Thursday, 7 February 13
  • 69. Terminology • Profiles and Roles are Puppet modules • Components are Puppet modules responsible for modelling resources • Everything is a module Thursday, 7 February 13
  • 70. Naming conventions • Components should be named after what they manage (apache, ssh, mysql) • Profiles should be named after the logical stack they implement (database, bastion, email) • Roles should be named in business logic convention (uat_server, web_cluster, application, archive) Thursday, 7 February 13
  • 71. Hiera Overview Let’s talk about data! Thursday, 7 February 13
  • 72. Managing infrastructure Dev Thursday, 7 February 13
  • 73. Managing infrastructure Dev QA Thursday, 7 February 13
  • 74. Managing infrastructure Dev QA Production Thursday, 7 February 13
  • 75. Managing infrastructure Dev QA DC1 Production Thursday, 7 February 13
  • 76. Managing infrastructure Dev QA DC1 DC2 DC3 Production Thursday, 7 February 13
  • 77. Managing data in Puppet is hard. Thursday, 7 February 13
  • 78. Without Hiera? if ( $::environment == ‘dev’ ) { $ntpserver = ‘192.168.2.1’ } else { if ( $::fqdn == ‘host4.mycorp.com’) { $ntpserver = ‘127.0.0.1’ } else { $ntpserver = ‘213.21.6.4’ } } Thursday, 7 February 13
  • 79. With Hiera? $ntpserver = hiera(‘ntpserver’) Thursday, 7 February 13
  • 80. Hierarchical lookups • Hiera uses facter facts to determine a hierarchy • Top down hierarchy for overriding configuration values based on roles, environments, locations.... or anything else • And do this without any coding! Thursday, 7 February 13
  • 81. Separation of data from code • Puppet modules without hard-coded data are easily shared and more re-usable • Infrastructure configuration can be managed without needing to edit Puppet code Thursday, 7 February 13
  • 82. Pluggable Backends • Source data from multiple locations • Data source is abstracted from code Thursday, 7 February 13
  • 83. Pluggable Backends • Source data from multiple locations • Data source is abstracted from code • hiera-gpg • hiera-redis • hiera-http • hiera-json • hiera-mysql • hiera-zookeeper Thursday, 7 February 13
  • 84. Data Separation • Use Hiera to abstract your data from your code • Components and profiles can source data from Hiera Thursday, 7 February 13
  • 85. Profiles and Hiera • Use Hiera to model your data • Use profiles to model your implementation Thursday, 7 February 13
  • 86. The Stack Roles : Business Logic Profiles : Implementation Components: Resource modelling Resources Thursday, 7 February 13
  • 87. The Stack Roles : Business Logic Profiles : Implementation Hiera: Data Components: Resource modelling Resources Thursday, 7 February 13
  • 88. Classification • Assigning classes to a node • You can classify within Puppet code (site.pp) • You can use an External Node Classifier (ENC) Thursday, 7 February 13
  • 89. Leveraging an ENC • You can classify your nodes however you want • Puppet Dashboard • Enterprise Console • Foreman • Site.pp • Custom script Thursday, 7 February 13
  • 90. Leveraging an ENC • An ENC should classify a node to it’s role • Nothing else Thursday, 7 February 13
  • 91. The Stack Roles : Business Logic Profiles : Implementation Hiera: Data Components: Resource modelling Resources Thursday, 7 February 13
  • 92. The Stack Roles : Business Logic Classifier Profiles : Implementation Hiera: Data Components: Resource modelling Resources Thursday, 7 February 13
  • 93. 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 Thursday, 7 February 13
  • 95. This is not the way to design Puppet... It’s a way. Thursday, 7 February 13
  • 96. Can I implement this design without roles? Thursday, 7 February 13
  • 97. Can I implement this design without roles? • Yes. • You lose the layer of abstraction that exposes business logic Thursday, 7 February 13
  • 98. Can my roles be defined in my ENC? Thursday, 7 February 13
  • 99. Can my roles be defined in my ENC? • Yes. • Keeping it in code makes it versionable Thursday, 7 February 13
  • 100. Can’t I just use Hiera to define profiles? Thursday, 7 February 13
  • 101. 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 • You could possibly use: https://github.com/ ripienaar/hiera-puppet-nodes Thursday, 7 February 13
  • 102. The fundamental concepts.... Thursday, 7 February 13
  • 103. The fundamental concepts.... • Abstraction, abstraction, abstraction Thursday, 7 February 13
  • 104. The fundamental concepts.... • Abstraction, abstraction, abstraction • Decoupling business logic, implementation and resource modelling. Thursday, 7 February 13
  • 105. The fundamental concepts.... • Abstraction, abstraction, abstraction • Decoupling business logic, implementation and resource modelling. • Separating data and code Thursday, 7 February 13
  • 106. The fundamental concepts.... • Abstraction, abstraction, abstraction • Decoupling business logic, implementation and resource modelling. • Separating data and code • Reducing node-level complexity Thursday, 7 February 13
  • 107. Other Resources • Adrien Thebos’ excellent blog post http:// sysadvent.blogspot.co.uk/2012/12/day-13-configuration-management-as- legos.html • My original blog post 2012/05/239/ http://www.craigdunn.org/ • Module Structure Redux by R.I.Pienaar http:// www.devco.net/archives/2012/12/13/simple-puppet-module-structure- redux.php Thursday, 7 February 13
  • 108. Thank you. Questions? • Follow me at @crayfishX • Bug me on Freenode: crayfishx Enjoy the rest of Puppet Camp! In memory of Giles Constant, who spent many nights debating Puppet design patterns with me over copious amounts of beer and helped me on my journey of discovery learning how to implement Puppet properly. R.I.P Thursday, 7 February 13