power of puppet 4
TRANSCRIPT
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
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
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
HEREDOC syntax check@(EOF:json)
Can be used by e.g. Gepetto or any other Puppet plugin
Built in : json
$var = @(EOF:json) { “Puppet”: ‘awesome’ } - EOF
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? !!!!!!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
DeprecationsNode inheritance
Empty string comparison
Variable naming
Reference syntax
Hyphens in names
Ruby DSL
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$message = ‘’ !if $message { notify { “Message: ${message}”: } }
Empty string set as default !Check for variable existing and having content
String comparison$ message = ‘’ !if $message and $message != ‘’ { notify { “Message: ${message}”: } }
Empty string set as default !Check for variable existing and not empty string
Reference syntaxReference 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!<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
More information
https://docs.puppetlabs.com/puppet/3.7/reference/deprecated_language.html
http://puppet-on-the-edge.blogspot.de/
https://github.com/puppetlabs/puppet-specifications