puppet camp berlin 2015: martin alfke | the power of puppet 4
TRANSCRIPT
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