20150613 self-puppet v4-avoiding_dragons

60
Puppet v4 Avoiding Dragons Garrett Honeycutt [email protected] LearnPuppet.com @learnpuppet

Transcript of 20150613 self-puppet v4-avoiding_dragons

Page 1: 20150613 self-puppet v4-avoiding_dragons

Puppet v4Avoiding Dragons

Garrett Honeycutt

[email protected]

LearnPuppet.com

@learnpuppet

Page 2: 20150613 self-puppet v4-avoiding_dragons

AIO

Page 3: 20150613 self-puppet v4-avoiding_dragons

puppet-agent package from PC1

augeas (1.3.0) ruby (2.1.6)

cfacter (0.4.1) ruby-augeas (0.5.0)

facter (2.4.4) ruby-selinux(2.0.94)

hiera (2.0.1) ruby-shadow (2.3.3)

marionette-collective (2.8.2) ruby-stomp (1.3.3)

openssl (1.0.0r) rubygem-deep-merge(1.0.0)

puppet (4.1.0) rubygem-net-ssh (2.1.4)

virt-what (1.1.4)

Page 4: 20150613 self-puppet v4-avoiding_dragons

Bye ByeApache+Passenge

r

Page 5: 20150613 self-puppet v4-avoiding_dragons

HelloJVM+Closure+JRu

by

Page 6: 20150613 self-puppet v4-avoiding_dragons

Ruby 1.8.7

RIP

Page 7: 20150613 self-puppet v4-avoiding_dragons

OSX <= 10.6(snow leopard)

RIP

Page 8: 20150613 self-puppet v4-avoiding_dragons

Where iseverything?

Page 9: 20150613 self-puppet v4-avoiding_dragons

Mostly under/opt/puppetlabs

Page 10: 20150613 self-puppet v4-avoiding_dragons

/opt/puppetlabs/bin

Add to $PATH

Page 11: 20150613 self-puppet v4-avoiding_dragons

/opt/puppetlabs/puppet/bin

Private programs for Puppetsuch as ruby and gem

Page 12: 20150613 self-puppet v4-avoiding_dragons

configuration is in /etc/puppetlabs/puppet

Page 13: 20150613 self-puppet v4-avoiding_dragons

$ ls /etc/puppetlabs

code

mcollective

puppet

puppetserver

Page 14: 20150613 self-puppet v4-avoiding_dragons

SSL where!?

/etc/puppetlabs/puppet/ssl

Page 15: 20150613 self-puppet v4-avoiding_dragons

/etc/puppetlabs/code

Hiera configuration Hiera data Static modules Environments

Page 16: 20150613 self-puppet v4-avoiding_dragons

Environments

/etc/puppetlabs/code/environments

Page 17: 20150613 self-puppet v4-avoiding_dragons

Manytype/providerimprovements

Page 18: 20150613 self-puppet v4-avoiding_dragons

Facts are notall strings

Page 19: 20150613 self-puppet v4-avoiding_dragons

$ facter os --yaml---os: name: CentOS family: RedHat release: major: '7' minor: '1' full: 7.1.1503

Page 20: 20150613 self-puppet v4-avoiding_dragons

class foo (

$bar = true,

) {

if is_string($bar) == true {

$bar_real = str2bool($bar)

} else {

$bar_real = $bar

}

validate_bool($bar_real)

}

Page 21: 20150613 self-puppet v4-avoiding_dragons

Templates withEPP

epp(module/foo.epp)

Page 22: 20150613 self-puppet v4-avoiding_dragons

Language

Page 23: 20150613 self-puppet v4-avoiding_dragons

Iteration withlambdas

.each is here

Page 24: 20150613 self-puppet v4-avoiding_dragons

$list = ['a','b','c']

each($list) |$index, $value|

{

notice("${index} = ${value}")

}

Page 25: 20150613 self-puppet v4-avoiding_dragons

Notice: Scope(Class[main]): 0 = a

Notice: Scope(Class[main]): 1 = b

Notice: Scope(Class[main]): 2 = c

Page 26: 20150613 self-puppet v4-avoiding_dragons

['a','b','c'].each |$index, $value|

{

notice("${index} = ${value}")

}

Page 27: 20150613 self-puppet v4-avoiding_dragons

Notice: Scope(Class[main]): 0 = a

Notice: Scope(Class[main]): 1 = b

Notice: Scope(Class[main]): 2 = c

Page 28: 20150613 self-puppet v4-avoiding_dragons

Lambdas.each

.slice

.filter

.map

.reduce

.with

Page 29: 20150613 self-puppet v4-avoiding_dragons

Type casting

Page 30: 20150613 self-puppet v4-avoiding_dragons

class foo (

$bar = true,

) {

if is_string($bar) == true {

$bar_real = str2bool($bar)

} else {

$bar_real = $bar

}

validate_bool($bar_real)

}

Page 31: 20150613 self-puppet v4-avoiding_dragons

class foo (

Boolean $bar = true,

) {

# Remove all this code!

#

# if is_string($bar) == true {

# $bar_real = str2bool($bar)

# } else {

# $bar_real = $bar

# }

# validate_bool($bar_real)

}

Page 32: 20150613 self-puppet v4-avoiding_dragons

String

Integer, Float, and Numeric

Boolean

Array

Hash

Regexp

Undef

Default

Page 33: 20150613 self-puppet v4-avoiding_dragons

Scalar Struct

Collection Optional

Variant Catalogentry

Data Type

Pattern Any

Enum Callable

Tuple

Page 34: 20150613 self-puppet v4-avoiding_dragons

Upgrading

Page 35: 20150613 self-puppet v4-avoiding_dragons

Never upgradein place

Page 36: 20150613 self-puppet v4-avoiding_dragons

Create newpuppetmasters

Page 37: 20150613 self-puppet v4-avoiding_dragons

common nscd rsyslog

dnsclient nsswitch selinux

facter ntp ssh

hosts pamsysklogd

inittab papertrail timezone

localization puppet types

nfs redhat utils

nrpe rpcbind vim

Page 38: 20150613 self-puppet v4-avoiding_dragons

Travis-ci

Page 39: 20150613 self-puppet v4-avoiding_dragons

# spec/spec_helper.rb

RSpec.configure do |config|

config.before :each do

Puppet[:parser] = 'future' if ENV['PARSER'] == 'future'

end

end

Page 40: 20150613 self-puppet v4-avoiding_dragons

# .travis.yml

env:

matrix:

- PUPPET_GEM_VERSION="~> 3.1"

- PUPPET_GEM_VERSION="~> 3.2"

- PUPPET_GEM_VERSION="~> 3.3"

- PUPPET_GEM_VERSION="~> 3.4"

- PUPPET_GEM_VERSION="~> 3.5"

- PUPPET_GEM_VERSION="~> 3.6"

- PUPPET_GEM_VERSION="~> 3.7"

- PUPPET_GEM_VERSION="~> 3.8"

- PUPPET_GEM_VERSION="~> 3" PARSER="future"

- PUPPET_GEM_VERSION="~> 4.0"

- PUPPET_GEM_VERSION="~> 4.1"

- PUPPET_GEM_VERSION="~> 4"

Page 41: 20150613 self-puppet v4-avoiding_dragons

# .travis.yml

---

language: ruby

rvm:

- 2.1.0

sudo: false

env:

matrix:

- PUPPET_GEM_VERSION="~> 3" PARSER="future"

- PUPPET_GEM_VERSION="~> 4"

script: 'bundle exec metadata-json-lint metadata.json && bundleexec rake validate && bundle exec rake lint && SPEC_OPTS="--format documentation" bundle exec rake spec'

matrix:

fast_finish: true

notifications:

email: false

Page 42: 20150613 self-puppet v4-avoiding_dragons

ResourceOverrides

Page 43: 20150613 self-puppet v4-avoiding_dragons

Service ['nfs_service'] {

ensure => running,

enable => true,

hasstatus => true,

hasrestart => true,

}

Page 44: 20150613 self-puppet v4-avoiding_dragons

Service['nfs_service'] {

ensure => running,

enable => true,

hasstatus => true,

hasrestart => true,

}

Page 45: 20150613 self-puppet v4-avoiding_dragons

type()

Page 46: 20150613 self-puppet v4-avoiding_dragons

Error: Illegalexpression. AReserved Word'type' isunacceptable asfunction name

Page 47: 20150613 self-puppet v4-avoiding_dragons

type3x()

Page 48: 20150613 self-puppet v4-avoiding_dragons

stdlib

Page 49: 20150613 self-puppet v4-avoiding_dragons

puppetlabs/stdlib >= 4.6.0 < 6.0.0

v4.6.0 includes type3x()

Page 50: 20150613 self-puppet v4-avoiding_dragons

validate_absolute_path()

Now accepts arrays :)

Broke my spec tests :(

Page 51: 20150613 self-puppet v4-avoiding_dragons

Error codes changedslightly

Broke my spec tests :(

Page 52: 20150613 self-puppet v4-avoiding_dragons

expected Puppet::Error withmessage matching /^true isnot a string/, got

#<Puppet::Error: EvaluationError: Error whileevaluating a Function Call,true is not a string. Itlooks to be a TrueClass

Page 53: 20150613 self-puppet v4-avoiding_dragons

Got rid of '^' in regex so it was notbeing as explicit.

Page 54: 20150613 self-puppet v4-avoiding_dragons

Templates

Page 55: 20150613 self-puppet v4-avoiding_dragons

Must have @var instead of just var.

Check inline_template() too.

Page 56: 20150613 self-puppet v4-avoiding_dragons

Stop using inline_template()

Page 57: 20150613 self-puppet v4-avoiding_dragons

NodeInheritance

RIP

Page 58: 20150613 self-puppet v4-avoiding_dragons

node common {

include ssh

}

node 'f.example.com' inherits common {

include apache

}

Page 59: 20150613 self-puppet v4-avoiding_dragons

Upgrade Checklist

* setup Travis (or equiv)* test* test* test

Page 60: 20150613 self-puppet v4-avoiding_dragons

Puppet v4Avoiding Dragons

Garrett Honeycutt

[email protected]

LearnPuppet.com

@learnpuppet