puppet camp berlin 2015: the power of puppet 4

Post on 20-Jul-2015

111 Views

Category:

Documents

6 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Text

The Power of Puppet 4Martin Alfke ma@example42.com

Image: http://praetoris01.deviantart.com/

Martin Alfke

PL Training Partner

Module Contributor

!

Freelancer / example42

Infrastructure Architect

Welcome Puppet 4April 15th 2015

https://puppetlabs.com/blog/say-hello-open-source-puppet-4

http://docs.puppetlabs.com/puppet/4.0/reference/index.html

Puppet Anniversary

founded in 2005

Puppet Server & Packages

Puppet Server on JVM

Clojure

Trapperkeeper

JMX & internal metrics (PE only)

Puppet Packaging

AIO - like PE

New package name

New repository layout

No automatic update

Environments

Config environmentsStatic puppet.conf

[production] modulepath = /etc/puppet/production/modules manifests = /etc/puppet/production/manifests/site.pp ![test] modulepath = /etc/puppet/test/modules manifests = /etc/puppet/test/manifests/site.pp

Config environmentsDynamic puppet.conf

[master] modulepath = /etc/puppet/$environment/modules manifests = /etc/puppet/$environment/manifests/site.pp !

Directory environmentspuppet.conf

[master] environmentpath = /etc/puppet/environments !File system /etc/puppet/environments/ production/ modules/ manifests/ environment.conf test/ modules/ manifests/

Directory

Benefits

All environments in one place

Per environment configuration (environment.conf)

config_version = '/usr/bin/git --git-dir /etc/puppet/environments/$environment/.git rev-parse HEAD'

Newly added environments are available immediately

r10k

Robot 10000

Manage environment in git branches

Puppetfile handles modules and versions

New language features

Lambdas

Lambda

“a block of code that has parameters and can be invoked/called with arguments. A single lambda can be passed to a function”

$a = [1,2,3] each($a) |value| {notice $value }

Lambdas and functions

each - iterating over an array

map - transform an array or hash into a new array

filter - filters an array or hash

reduce - reduces an array or hash to a single value

slice - slices an array or hash into chunks

Using functions

Standard Puppet way:

function_name(argument) - each($variable)

Ruby way - chaining

argument.function_name - $variable.each

EPP Template engine

Use Puppet $var instead of Ruby @var

epp(filename)

inline_epp(epp_string)

HEREDOC support

Like Shell HEREDOC

$multiline_text = @(EOF) # Managed by Puppet intended two spaces starting at beginning of line | intention starts at pipe sign EOF

HEREDOC control character

- prevents a new line (like erb/epp)

@(“EOF”) - variable substition

@(EOF/tn) - enables char escapes

availabe char escapes: t,s,r,n,u,L,$

Default to off

Puppet 4.0 Data Bindings

New “hierarchy”:

global data (hiera)

data in environment (environment.conf)

data in modules

Types, Types, Types

Why do we need types?class ssh ( $server = true, ) { if $server { include ssh::server } }

Parameterized class with parameter default

Why do we need types?class ssh ( $server = true, ) { if $server { include ssh::server } } !!class { ‘ssh’: server => ‘false’, }

!!!!!!!!!Usage of parameterised class. But: string instead of boolean !

Why do we need types?class ssh ( $server = true, ) { if validate_bool($server) { include ssh::server } } !!class { ‘ssh’: server => ‘false’, }

Parameterized class with parameter default !!Now with data validation (from stdlib)

Why do we need types?users::hash: ‘tom’: gid: ‘123’ home: ‘/home/tom’ managehome: false ‘ben’: gid: ‘124’ home: /home/ben managehome: ‘true’ ‘tim’: gid: 0125 home: ‘home/tim’ managehome: ‘false’

But: how to deal with more complex data? !!Do you see the errors?

Why do we need types?users::hash: ‘tom’: gid: ‘123’ home: ‘/home/tom’ managehome: false ‘ben’: gid: ‘124’ home: /home/ben managehome: ‘true’ ‘tim’: gid: 0125 home: ‘home/tim’ managehome: ‘false’

But: how to deal with more complex data? !!!!!!Missing quotes String instead of bool !Missing quotes and leading 0 Missing trailing slash String instead of bool

We need types!class ssh ( Boolean $server = true, ) { if $server { include ssh::server } }

!Types, Types, Types, Types

We need types!class ssh ( Boolean $server = true, ) { if $server { include ssh::server } } !!class { ‘ssh’: server => ‘false’, } !Error 400 on SERVER: Expected parameter 'server' of 'Class[Ssh]' to have type Boolean, got String

!!!!!!!!!We now get proper error messages.

We want types!class users ( Hash $hash ) { $userarray = keys($hash) users::user_data { $userarray: } } !define users::user_data ( String $gid = $users::hash[$title][gid], String $home = $users::hash[$title][home], Boolean $managehome = $users::hash[$title][managehome], ) { }

Available TypesInteger[from, to]

Float[from,to]

Enum[*strings]

Pattern[*patterns]

Regexp[regexp]

Boolean

Array

Hash

Deprecations

Node Inheritancenode ‘basenode’ { include base include security } !node ‘www.server.com’ inherits basenode { include webserver }

# Dummy node as default !!!!# Real node inherits from basenode

Roles & Profilesnode ‘www.server.com’ { include webserver } !!class basenode { include base include security } !class webserver { include basenode }

# No more node inheritance !!!!# Define a class instead

Empty string comparison

An empty string compares to true instead of false

Empty string comparison$message = ‘’ !if $message { notify { “Message: ${message}”: } }

Empty string set as default !Check for variable existing and having content

Empty string comparison$message = ‘’ !if $message and $message != ‘’ { notify { “Message: ${message}”: } }

Empty string set as default !Check for variable existing and not empty string

Variable naming

A variable may not start with

a capital letter

an underscore (well. yes. it may. but. it’s private.)

Reference NamingReference deprecation

capital letter on title

empty space between Type reference and title!Class [Ssh] !Class [‘ssh’] !Class[‘ssh’]

!Deprecated capital title !Empty space !Working

Hyphens in names

No more hyphens in

module name

class name

define name

Hyphens in names!<modulepath>/syslog-ng/ !<modulepath>/syslog_ng !class syslog-ng { … } !class syslog_ng { … }

!Deprecated !New name required !Deprecated !New name required (obious -> module/class naming convention)

Ruby DSLPuppet Ticket #18876

Closed 02/04/2013

New Ruby DSL API was revamped: “the number and severity of issues that came up in exploratory testing led us to the conclusion that it was not supportable code” - Puppet Dev ML - 01/26/2013

hostclass ‘ssh’ do end

More deprecation

Relative resolution of class names - the reason why you want to use double colon - include ::ssh

Importing manifests

Matching numbers with regexp

Search function

Mutating arrays and hashes

The 4 Powers of Puppet 4

Performance

Request response times and catalog compile times

!

!

Scalability

Switch on/off functionality for multi master setup

!

!

!

Measurability

Flexibility

Dealing with complex data natively in Puppet DSL

Upgrading to Puppet 4Breaks old style Puppet DSL code

Read documentation carefully

Run tests

Proposed way: new master

Text

Support your modulesWrite PR, file bug reports, fix issues

More information

http://puppet-on-the-edge.blogspot.com/

https://github.com/puppetlabs/puppet-specification

http://camptocamp.com/actualite/getting-code-ready-puppet-4/

More information

https://docs.puppetlabs.com/puppet/3.7/reference/deprecated_language.html

http://docs.puppetlabs.com/puppet/4.0/reference/index.html

https://puppetlabs.com/blog/welcome-puppet-collections

Text

The Power of Puppet 4Martin Alfke ma@example42.com

Image: http://praetoris01.deviantart.com/

top related