Puppet Tutorial -...

81
Puppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant @ GH Solutions, LLC [email protected] http://linkedin.com/in/garretthoneycutt

Transcript of Puppet Tutorial -...

Page 1: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Puppet Tutorial

OSCON2013-07-22

Portland, OR

Garrett HoneycuttAutomation Consultant @ GH Solutions, LLC

[email protected]://linkedin.com/in/garretthoneycutt

Page 2: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

# whoami

an engineer and obviously not a graphic designer

Page 3: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Why?

• reduce entropy

Page 4: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Why?

• reduce entropy

• change management

Page 5: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Why?

• reduce entropy

• change management

• infrastructure as code

Page 6: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

How Puppet Works

Define: With Puppet's declarative language you design a graph of relationships between resources within reusable modules. These modules define your infrastructure in its desired state.

1

Simulate: With this resource graph, Puppet is unique in its ability to simulate deployments, enabling you to test changes without disruption to your infrastructure.

2

Enforce: Puppet compares your system to the desired state as you define it, and automatically enforces it to the desired state ensuring your system is in compliance.

3

Report: Puppet Dashboard reports track relationships between components and all changes, allowing you to keep up with security and compliance mandates. And with the open API you can integrate Puppet with third party monitoring tools.

4

DESIREDSTATE

CURRENTSTATE

ITER

ATE

AN

D IN

CREA

SE C

OVERAGE

Page 7: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Multi Node

Use Puppet to create composable configurations and manage the enterprise infrastructure

Define Your Resources in Modules. ! "#$%!&'(()$*!+,'!-).#/)!+,'0!1,-'2)3!4+!/,-)!52633#.#56$#,/3*!3'5%!63!")4!7)08)0!,0!96$6463)*!622,:#/;!+,'!$,!-).#/)!0)26$#,/3%#(3!4)$:))/!0)3,'05)3!6/-!5,/.#;'0)!$%,'36/-3!,.!3)08)03!6$!,/5)<!

1

Assign resource relationships automatically.!! =,'!56/!$%)/!633#;/!6/-!-)(2,+!5,/.#;'06$#,/3!8#6!&'(()$!963%4,60-*!,0!:#$%!+,'0!,:/!5'3$,1#>)-!?@9A!$,,23<

Via Puppet Dashboard

CustomExternal Source

(CMDB, LDAP, etc.)

2

Reusable, composable configurations. !! "#$%!&'(()$!+,'!56/!0)B'3)!1,-'2)3!650,33!1'2$#(2)!/,-)3*!#/!:%6$)8)0!5,14#/6$#,/!+,'!/))-*!0)-'5#/;!0)()$#$#8)!$63C3!6/-!)2#1#/6$#/;!)00,0B(0,/)!350#($3<!

3

"DA!7DEFDE7 9GHGAG7D!7DEFDE7 G&&IJ?GHJKL!7DEFDE7

LK9D

LK9D LK9D

LK9D LK9D

LK9D

9GHGAG7D "DA!7DEFDE G&&!7DEFDE 7D?MEJH=Mod

ules

Page 8: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Puppet Assigns and Maintains a Node’s Desired Role

Page 9: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Managing Configuration Drift

Page 10: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

How Puppet Manages Data Flow for Individual Nodes

FactsThe node sends normalized data about itself to the Puppet Master.

1

CatalogPuppet uses the Facts tocompile a Catalog thatspecifies how the nodeshould be configured.

2

Report3XSSHW·V�RSHQ�$3,�can also send data to third party tools.

4

ReportThe node reports back to Puppet indicating the configuration is complete, which is visible in the Puppet Dashboard.

3

Report Collector(Puppet or 3rd party tool)

Node

PuppetMaster

SSL secure encryption on all data transport

Page 11: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Facts

Automatically Maintained Asset

Inventory

Page 12: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

architecture => i386domain => localfacterversion => 1.6.6fqdn => sliver.localhardwareisa => i386hardwaremodel => i386hostname => sliverid => ghinterfaces => lo0,gif0,stf0,en0,en1,fw0ipaddress => 192.168.101.185ipaddress_en1 => 192.168.101.185ipaddress_lo0 => 127.0.0.1is_virtual => falsekernel => Darwinkernelmajversion => 10.8kernelrelease => 10.8.0kernelversion => 10.8.0memoryfree => 102.80 MB

Page 13: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Custom Facts

Page 14: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

How Puppet Manages Data Flow for Individual Nodes

FactsThe node sends normalized data about itself to the Puppet Master.

1

CatalogPuppet uses the Facts tocompile a Catalog thatspecifies how the nodeshould be configured.

2

Report3XSSHW·V�RSHQ�$3,�can also send data to third party tools.

4

ReportThe node reports back to Puppet indicating the configuration is complete, which is visible in the Puppet Dashboard.

3

Report Collector(Puppet or 3rd party tool)

Node

PuppetMaster

SSL secure encryption on all data transport

Page 15: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Catalog

Comprehensive list of resources

Page 16: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

How Puppet Manages Data Flow for Individual Nodes

FactsThe node sends normalized data about itself to the Puppet Master.

1

CatalogPuppet uses the Facts tocompile a Catalog thatspecifies how the nodeshould be configured.

2

Report3XSSHW·V�RSHQ�$3,�can also send data to third party tools.

4

ReportThe node reports back to Puppet indicating the configuration is complete, which is visible in the Puppet Dashboard.

3

Report Collector(Puppet or 3rd party tool)

Node

PuppetMaster

SSL secure encryption on all data transport

Page 17: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Reporting

every change correlated to every

resource

Page 18: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Reporting

• http/https

• log

• store

• tagmail

• custom processors

• irc

• twitter

• jabber

• growl

Page 19: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant
Page 20: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

What not How

Page 21: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

What not how

Page 22: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Example Resource Types• cron

• exec

• file

• group

• host

• zfs

• mount

• package

• service

• sshkey

• user

Page 23: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

File Serving

Page 24: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Templates

Page 25: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Templates - Advanced

Page 26: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Package-File-Service

Page 27: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

172.16.132.128  puppet.oscon.priv  puppet

BootstrapModify /etc/hosts

Page 28: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Run one time, verbose, in the foreground

• #  puppet  agent  -­‐t

add -d for debug

• #  puppet  agent  -­‐t  -­‐d

useful agent flags

Page 29: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Facter

all facts

• #  facter

specific fact

• #  facter  fqdn

custom facts

• #  facter  -­‐p

Page 30: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Specific resource

• #  puppet  resource  <resource  type>  <specific  resource>

• #  puppet  resource  user  root

All resources of that type

• #  puppet  resource  <resource  type>

• #  puppet  resource  group

puppet resource

Page 31: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

add a user

• #  puppet  resource  user  gh  ensure=present

stop and start a service

• #  puppet  resource  service  postfix  ensure=stopped

• #  puppet  resource  service  postfix  ensure=running

puppet resource

Page 32: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

/etc/puppet/puppet.conf

• #  puppet  config  print

• #  puppet  config  print  modulepath

configs

Page 33: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• where to look for modules

• acts like $PATH - stop at first match

• great for working with multiple teams, just put your path first

modulepath

Page 34: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• manage specific parts of your system

• directory structure for finding your code

modules

Page 35: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Create our first module

• #  cd  /etc/puppet/modules

• #  puppet  module  generate  yourname-­‐motd  &&  mv  yourname-­‐motd  motd

modules

Page 36: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

What’s all here?

• #  tree  motd

modules

Page 37: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• meta data

• semver.org

• dependencies

Modulefile

Page 38: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• search for packages

• #  puppet  module  search  mysql

• http://forge.puppetlabs.com

Forge

Page 39: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• install a package

• #  puppet  module  install  ghoneycutt-­‐dnsclient

Forge

Page 40: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

include dnsclient class

• #  puppet  agent  -­‐t

check out /etc/resolv.conf

• #  cat  /etc/resolv.conf

site manifest/etc/puppet/manifests/site.pp

Page 41: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• contains the code

• can be included in site manifest or in other classes

• check out motd

classes

Page 42: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Resources

type  {  ‘title’:    attribute  =>  value,}

Page 43: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

file

file  {  ‘/etc/motd’:    ensure  =>  file,}

Page 44: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

file

file  {  ‘/etc/motd’:    ensure  =>  file,    owner    =>  ‘root’,    group    =>  ‘root’,    mode      =>  ‘0644’,}

Page 45: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

include motd in site manifest

• #  puppet  agent  -­‐t

modify owner/group/mode

• #  puppet  agent  -­‐t;  stat  /etc/motd

motd

Page 46: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• run puppet

• run it again

• nothing happened!!

• make a change

• run puppet

• ensures state

idempotency

Page 47: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

filesdemo module

Discuss module

Page 48: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

resource defaults

File  {    owner  =>  ‘root’,    group  =>  ‘root’,    mode    =>  ‘0644’,}

Page 49: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• refactor code to use resource defaults

• what about the directory? 0644 would not be good!

test module

Page 50: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• parser check

• #  puppet  parser  validate  <file.pp>

• or use the bash function `pc` from /root/.bashrc

• style guide - http://docs.puppetlabs.com/guides/style_guide.html

• #  puppet-­‐lint  <file.pp>

• add these to your pre-commit scripts!

validation

Page 51: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• create directory /etc/puppet/modules/motd/files

• create a file, motd, with some text

file serving

Page 52: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

file serving

file  {  ‘/etc/motd’:    ensure  =>  file,    source  =>  ‘puppet:///modules/motd/motd’,    owner    =>  ‘root’,    group    =>  ‘root’,    mode      =>  ‘0644’,}

Page 53: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

file serving

puppet:///modules/<module_name>/<file_name>

puppet  looks  for  <module_name>  in  $modulepath  and  <file_name>  under  files  directory.

This  is  how  it  finds  /etc/puppet/modules/motd/files/motd

Page 54: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

variables

#  assign  a  value  to  variable$variable  =  ‘value’

#  use  a  variablenotify  {  “variable  is  ${variable}”:  }

#  facts  are  variablesnotify  {  “my  fqdn  is  ${::fqdn}”:  }

Page 55: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

variables - arrays

#  defining  a  variable  with  an  array  of  values$nameservers  =  ['4.2.2.1',                                '4.2.2.2',                                '8.8.8.8',                                ]

Page 56: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

file - content

$message  =  “Welcome  to  ${::fqdn}.\nTry  not  to  break  anything”

file  {  ‘/etc/motd’:    ensure    =>  file,    content  =>  $message    owner      =>  ‘root’,    group      =>  ‘root’,    mode        =>  ‘0644’,}

Page 57: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• uses the template() function

• which uses erb for the templating engine

• files go under <module_name>/templates/ with .erb as the suffix

templates

Page 58: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• content  =>  template(‘motd/motd.erb’),

• #  puppet  agent  -­‐t

templates

Page 59: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

templates

content  =>  template(‘module_name/template.erb’),

puppet  looks  for  <module_name>  in  $modulepath  and  <template.erb>  under  templates  directory.

This  is  how  it  finds  /etc/puppet/modules/motd/templates/motd.erb

Page 60: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• /usr/bin/erb  -­‐P  -­‐x  -­‐T  '-­‐'  <file.erb>  |  /usr/bin/ruby  -­‐c

• or use the bash function `pt` from /root/.bashrc

template validation

Page 61: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

templates

#  use  a  variable

<%=  @message  %>

Page 62: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

templates

#  iteration

<%  @nameservers.each  do  |nameserver|  -­‐%>nameserver  <%=  nameserver  %><%  end  -­‐%>

Page 63: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

templates

#  conditionals

<%  if  @lsbdistid  ==  'CentOS'  %>This  system  is  running  CentOS<%  end  %>

Page 64: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

templates

set a fact through the environment

#  export  FACTER_is_virtual  =  false

or

#  export  FACTER_virtual  =  kvm

Then run `puppet  agent  -­‐t;  cat  /etc/motd`

Page 65: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• before and require

ordering

Page 66: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• package{} then file{}

ordering - ntp module

Page 67: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• subscribe and notify

ordering - ntp module

Page 68: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• file{} then service{}

• restart service{} if any attribute of file{} changes

ordering - ntp module

Page 69: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• Without automation you would:

• #  yum  -­‐y  install  ntp

• #  vim  /etc/ntp.conf

• #  service  ntpd  start

• hope it works

Package - File - Service

Page 70: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Package - File - Service#  most  common  design  pattern

package  {  ‘ntp’:    ensure  =>  present,}

file  {  ‘/etc/ntp.conf’:    ...    require  =>  Package[‘ntp’],}

service  {  ‘ntpd’:    ...    subscribe  =>  File[‘/etc/ntp.conf’],}

Page 71: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Parameterized Classes#  define  a  class

class  say  ($msg,

)  {    notify  {  “message  =  ${msg}”:  }}

#  declare  a  class#  just  like  ‘include  say’  except  you  can  also  specify  msg

class  {  ‘say’:    msg  =>  ‘automation  is  fun’,}

Page 72: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• create say module

• declare say class in site manifest for one node

• include say class in site manifest for other node

Parameterized Classes

Page 73: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Parameterized Classes

#  oh  noes!!#  we  need  a  default

class  say  ($msg  =  ‘boring  default’,

)  {    notify  {  “message  =  ${msg}”:  }}

Page 74: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• hierarchical data lookup system with pluggable backends

• separate data from code, yay!

• Defaults to YAML, also has

• json

• mysql

• redis

• gpg encrypted files

• CLI demo

Hiera

Page 75: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• can lookup parameters

• add to a hiera file

• say::msg:  from  hiera

• run puppet

Hiera

Page 76: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• write facts in ruby

• placed in  lib/facter/factname.rb

Custom facts

Page 77: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Custom Facts

Page 78: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Custom Facts#  fact  for  each  cciss  device#  example:  cciss_c0d0  =>  present#require  'facter'if  File.exists?("/dev/cciss")    Dir.foreach("/dev/cciss")  {  |entry|        if  entry  =~  /^c[0-­‐9]d[0-­‐9]$/            Facter.add("cciss_#{entry}")  do                #  only  run  on  systems  where  the  kernel  fact  is  linux                confine  :kernel  =>  :linux                setcode  do                    "present"                end            end        end    }end

Page 79: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

• on master

• #  puppet  cert  list

• #  puppet  cert  -­‐-­‐list  -­‐-­‐all

• #  puppet  cert  -­‐-­‐sign  -­‐-­‐all

• #  puppet  cert  -­‐-­‐list  -­‐-­‐all

• on agent

• #  puppet  agent  -­‐t

SSL

Page 80: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Check out ssh module

/var/local/puppet-­‐modules/modules/ssh/manifests/init.pp

Exported Resources

Page 81: Puppet Tutorial - GarrettHoneycutttalks.garretthoneycutt.com/20130722-OSCON_Puppet_Tutorial.pdfPuppet Tutorial OSCON 2013-07-22 Portland, OR Garrett Honeycutt Automation Consultant

Puppet Tutorial

OSCON2013-07-22

Portland, OR

Garrett HoneycuttAutomation Consultant @ GH Solutions, LLC

[email protected]://linkedin.com/in/garretthoneycutt