Dive into Puppet 4

Julien Pivotto
Julien PivottoOpen Source Consultant at Inuits
Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4
A new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetize
Julien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien Pivotto
Belgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User Group
September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015
$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user
Julien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien Pivotto
• Open-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.eu
• Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011
• Speaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at Puppetcamps
• Member of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUG
• Puppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributor
• Puppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributor
• @roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie on irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/github
inuits.eu
IntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroductionIntroduction
Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011
• PPPPPPPPPPPPPPPPPuppet 2.6/2.7
• RRRRRRRRRRRRRRRRReports stored with activerecord
• PPPPPPPPPPPPPPPPPuppet Dashboard
• NNNNNNNNNNNNNNNNNo hiera
• NNNNNNNNNNNNNNNNNo PuppetDB
Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011
• RRRRRRRRRRRRRRRRRuby 1.9 support
• AAAAAAAAAAAAAAAAApache 2.0 Licence
• TTTTTTTTTTTTTTTTThe end of "random" catalog order
• SSSSSSSSSSSSSSSSSupport for network devices
• DDDDDDDDDDDDDDDDDeprecation of dynamic variables
Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012
• SSSSSSSSSSSSSSSSSupport for 3rd parties gems
• NNNNNNNNNNNNNNNNNative hiera support
• AAAAAAAAAAAAAAAAAutomatic hiera lookups
• RRRRRRRRRRRRRRRRRemove dynamic scope lookup
• SSSSSSSSSSSSSSSSSemantic versioning
Puppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x series
• FFFFFFFFFFFFFFFFFuture parser (3.2.0)
• """""""""""""""""contain" keyword (3.4.0)
• dddddddddddddddddirectory environments (3.5.0)
Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4
Licensed under a Creative Commons Attribution 2.0 License
https://www.flickr.com/photos/mujitra/4421810399
The big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big picture
• NNNNNNNNNNNNNNNNNew DSL language
• AAAAAAAAAAAAAAAAAll-in-one Package
• PPPPPPPPPPPPPPPPPuppetserver
A new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSL
Apache 2.0 License
https://github.com/ke4qqq/puppet-cloudstack
Domain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific Language
The goal of the Puppet DSL stays
the same: describe the final state of
your infrastructure.
The new DSL gets closer to other
programming languages: types,
iterations, predictive ordering…
OrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrdering
Licensed under a Creative Commons Attribution-ShareAlike 2.0 License
https://www.flickr.com/photos/lambertclement/19543885696
order.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pp
notify { ’ B e l g i a n ’ : }
notify { ’ Puppet ’ : }
notify { ’ User ’ : }
notify { ’ Group ’ : }
Puppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.x
Notice: Compiled catalog for nitrogen in environment
production in 0.02 seconds
Notice: User
Notice: /Stage[main]/Main/Notify[User]/message: defined
'message ' as 'User '
Notice: Belgian
Notice: /Stage[main]/Main/Notify[Belgian]/message:
defined 'message ' as 'Belgian '
Notice: Group
Notice: /Stage[main]/Main/Notify[Group]/message: defined
'message ' as 'Group '
Notice: Puppet
Notice: /Stage[main]/Main/Notify[Puppet]/message:
defined 'message ' as 'Puppet '
Notice: Finished catalog run in 0.02 seconds
Puppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.x
Notice: Compiled catalog for nitrogen in environment
production in 0.23 seconds
Notice: Belgian
Notice: /Stage[main]/Main/Notify[Belgian]/message:
defined 'message ' as 'Belgian '
Notice: Puppet
Notice: /Stage[main]/Main/Notify[Puppet]/message:
defined 'message ' as 'Puppet '
Notice: User
Notice: /Stage[main]/Main/Notify[User]/message: defined
'message ' as 'User '
Notice: Group
Notice: /Stage[main]/Main/Notify[Group]/message: defined
'message ' as 'Group '
Notice: Applied catalog in 0.01 seconds
OrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrdering
• AAAAAAAAAAAAAAAAAlways the same order
• PPPPPPPPPPPPPPPPPuppet 3.x: based on title-hash
• PPPPPPPPPPPPPPPPPuppet 4.x: order seen in the manifest
Puppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 ordering
• TTTTTTTTTTTTTTTTTime saver
• """""""""""""""""Hides" complexity
• AAAAAAAAAAAAAAAAAlign with other languages
• SSSSSSSSSSSSSSSSStill supports Require, Notify, …
• """""""""""""""""real" dependencies should still be
explicitely set (e.g cron job only installed if
packages is installed)
(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types
Licensed under a Creative Commons Attribution 2.0 License
https://www.flickr.com/photos/ionics/6338281766
Data types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not new
• PPPPPPPPPPPPPPPPPreviously included in stdlib, 3rd party
module
• ssssssssssssssssstdlib contains functions to convert data
types, check data types
• NNNNNNNNNNNNNNNNNothing in Puppet Core
• DDDDDDDDDDDDDDDDDifficult to check the type of all the
parameters
Data TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData Types
String
Numeric: Integer, Float
Boolean
Array
Hash
Regexp
Undef
Catalogentry: Class, Resource
StringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringString
String Any string
String[2] Any string with at least 2 characters
String[0,2] A string with at most 2 characters
String[4,6] A string with at least 4 and at most 6 characters
String[5,5] A string with 5 characters
Convert to string with: "${myvariable}"
NumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumeric
Numeric Float or integer
Numeric[-1,1] Float or Integer between -1 and 1 (incl)
Integer Any integer (from −∞ to ∞)
Integer[0] Positive Integer
Integer[default, 0] Negative Integer
Integer[-1,1] Integer between -1 and 1 (incl)
Float Floating point number
Float[-3,3.14] Float between -3 and 3.14 (incl)
Convert to Integer with the scanf function or 0+$variable
HashHashHashHashHashHashHashHashHashHashHashHashHashHashHashHashHash
Hash
A Hash (key, value pairs)
Hash[String, String]
Hash with String as keys and values
Hash[String, Integer]
String as keys, Integer as values
Hash[String, Integer, 1]
Non empty hash
Hash[String, Integer, default, 5]
Hash with at most 5 entries
ArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArray
Array
An array (list)
Array[String]
Array with String
Array[String, 1]
Non empty Array
Array[String, default, 5]
Array with at most 5 entries
UndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndef
Eventually! A clear type for Undef (was very
confusing in the past: nil? string? symbol?)
Abstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data Types
Licensed under a Creative Commons Attribution 2.0 License
https://www.flickr.com/photos/webtreatsetc/4666231979
OptionalOptionalOptionalOptionalOptionalOptionalOptionalOptionalOptionalOptionalOptionalOptionalOptionalOptionalOptionalOptionalOptional
Optional[String]: String or Undef
Optional[Integer]: Integer or Undef
NotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndefNotUndef
Everything but Undef.
NotUndef[Data]: Anything that matches
Data but not Undef.
Example: [Undef]
VariantVariantVariantVariantVariantVariantVariantVariantVariantVariantVariantVariantVariantVariantVariantVariantVariant
Variant[Integer, String]: An
Integer or a String
PatternPatternPatternPatternPatternPatternPatternPatternPatternPatternPatternPatternPatternPatternPatternPatternPattern
Pattern[Regex, Regex]: Strings match
regexes
EnumEnumEnumEnumEnumEnumEnumEnumEnumEnumEnumEnumEnumEnumEnumEnumEnum
Enum["true", "false"]: "true" or
"false" (strings)
TupleTupleTupleTupleTupleTupleTupleTupleTupleTupleTupleTupleTupleTupleTupleTupleTuple
Tuple[Integer, String]: An array
like [1, "a"]
StructStructStructStructStructStructStructStructStructStructStructStructStructStructStructStructStruct
Advanced hash.
Struct[{"username" => String,
"uid" => Integer[0]}]
Matches {"username" => "tux", "uid"
=> 1}
ScalarScalarScalarScalarScalarScalarScalarScalarScalarScalarScalarScalarScalarScalarScalarScalarScalar
Same as Variant[Numeric, String,
Boolean, Regex]
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
Same as Variant[Scalar, Undef,
Array[Data], Hash[Scalar,
Variant[Data]]
AnyAnyAnyAnyAnyAnyAnyAnyAnyAnyAnyAnyAnyAnyAnyAnyAny
Anything
Playing with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with types
Licensed under a Creative Commons Attribution 2.0 License
https://www.flickr.com/photos/jdhancock/7439512656
Types in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditions
# Comparison
i f $m =~ Boolean {
$manage = $m
} e l s i f $m !~ Enum [ ’ t r u e ’ , ’ f a l s e ’ ] {
f a i l ( ’ Bad v a l u e ’ )
}
Types in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statements
case $user {
I n t e g e r : { $uid = $user }
Boolean : { $ c r e a t e = $user }
d e f a u l t : { f a i l ( ’ Bad Data Type ’ ) }
}
Types in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parameters
class p r o f i l e _ m y s q l (
Boolean $manage_service,
Enum [ ’ mysql ’ , ’ mariadb ’ ] $service_name,
Optional [ S t r i n g [ 8 ] ] $root_password,
) {
}
Type checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checking
# NOT CORRECT:
S t r i n g $runmode = $ f a c t s [ ’ runmode ’ ]
# Corre ct :
$runmode = a s s e r t _ t y p e ( S t r i n g , $ f a c t s [ ’
runmode ’ ] )
Array, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash merge
Licensed under a Creative Commons Attribution 2.0 License
https://www.flickr.com/photos/willmx/2295022876
HashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashes
$mascot1 = { ’ l i n u x ’ => ’ tux ’ }
$mascot2 = { ’ bsd ’ => ’ b e a s t i e ’ }
$mascots = $mascot1 + $mascot2
# { ’ l i n u x ’ => ’ tux ’ , ’ bsd ’ => ’ b e a s t i e ’ }
ArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArrays
$ d i s t r o = [ ’ Larry ’ , ’ Geeko ’ ]
$misc = [ ’ b l i n k y ’ , ’ f r e d ’ ]
$ a l l = $ d i s t r o + $misc
# [ ’ Larry ’ , ’ Geeko ’ , ’ b l i n k y ’ , ’ f r e d ’ ]
MergesMergesMergesMergesMergesMergesMergesMergesMergesMergesMergesMergesMergesMergesMergesMergesMerges
• NNNNNNNNNNNNNNNNNo more need for stdlib
• CCCCCCCCCCCCCCCCCleaner code
FunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctionsFunctions
Licensed under a Creative Commons Attribution 2.0 License
https://www.flickr.com/photos/zzpza/3269784239
Puppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 Function
# http :// puppet−on−the−edge . blogspot . se
Puppet : : Functions . c r e a t e _ f u n c t i o n ( : min ) do
d i s p a t c h : min do
param ’ Numeric ’ , : a
param ’ Numeric ’ , : b
end
def min ( x , y )
x <= y ? x : y
end
end
Puppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 Function
# http :// puppet−on−the−edge . blogspot . se
Puppet : : Functions . create_function ( : min) do
dispatch : min do
param ’ Numeric ’ , : a
param ’ Numeric ’ , : b
end
dispatch : min_s do
param ’ String ’ , : s1
param ’ String ’ , : s2
end
def min(x , y)
x <= y ? x : y
end
def min_s(x , y)
cmp = (x . downcase <=> y . downcase )
cmp <= 0 ? x : y
end
end
Loops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functions
Licensed under a Creative Commons Attribution-ShareAlike 2.0 License
https://www.flickr.com/photos/squeaks2569/8114399667
Loops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: Array
class vh o s t s ( Array [ S t r i n g ] $packages, ) {
$packages . each | S t r i n g $package | {
package {
” vhost−${package} ” :
ensure => p r e s e n t ,
}
}
}
Loops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: Hash
class vhosts (Hash[String, String] $packages,){
$packages.each | String $package, String $version | {
package {
"vhost−${package}":
ensure => $version,
}
}
}
Loops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduce
$total = reduce([1,2,3]) |$result, $value| {
$result + $value
}
# $total = 6
with: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scope
# ’ p r i v a t e ’ v a r i a b l e s
with ( ’ ldap ’ , ’ s e c r e t ’ ) | $ u s e r , $password | {
f i l e {
’ / etc / s e c r e t s ’ :
content => ” ${user} : $ { s e c r e t } ” ,
}
}
filterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilter
class vhosts (Hash[String, String] $packages,){
$packages.filter | String $package, String $version |
{
$version != 'latest'
}.each | String $package, String $version | {
package {
"vhost−${package}":
ensure => $version,
}
}
}
access resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parameters
class vhosts (Hash[String, String] $packages,){
$packages.filter | String $package, String $version |
{
$version != 'latest'
}.each | String $package, String $version | {
package {
"vhost−${package}":
ensure => $version,
}
}
$foo_version = Package["foo"]["version"]
}
ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)
$a = join(['foo', 'bar'], ',')
$b = ['foo', 'bar'].join(',')
HEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOC
# HEREDOC
$longstring = @(EOM)
This item is managed by Puppet
EOM
# Remove tabs
$longstring_notabs = @(EOM)
This item is managed by Puppet
| EOM
# Remove new lines + trailing line
$longstring_nonewline = @(EOM)
This item is managed by 
Puppet
|− EOM
# Syntax check
$longstring_nonewline = @(EOM:json)
["This item is managed by Puppet"]
|− EOM
TemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplates
Licensed under a Creative Commons Attribution 2.0 License
https://www.flickr.com/photos/mrbill/3267227227
TemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplates
• CCCCCCCCCCCCCCCCCan be written in Puppet Code (EPP)
• GGGGGGGGGGGGGGGGGets their own variables
• OOOOOOOOOOOOOOOOOnly useful since the new DSL
• fffffffffffffffffunction epp and inline_epp
EPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templates
f i l e {
’ pt−heartbeat −c o n f i g ’ :
show_diff => f a l s e ,
content => epp ( ’ pth / pth . epp ’ , {
database => $ d a t a b a s e ,
socket => $ s o c k e t ,
u s e r => $ u s e r ,
password => $password,
} ) ,
}
EPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templates
<%− |
S t r i n g $database ,
S t r i n g $password ,
S t r i n g $socket ,
S t r i n g $user ,
| −%>
u s e r=<%= $user %>
password=<%= $password %>
socket=<%= $socket %>
database=<%= $database %>
host=l o c a l h o s t
create −t a b l e
All-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One package
Licensed under a Creative Commons Attribution 2.0 License
https://www.flickr.com/photos/creative_tools/5299374697
All-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: Facts
• AAAAAAAAAAAAAAAAAll the client is in one RPM
• RRRRRRRRRRRRRRRRRepository is called PC1
• PPPPPPPPPPPPPPPPPuppet Collection 1
• pppppppppppppppppuppet-agent RPM contains ruby and all the
deps
• EEEEEEEEEEEEEEEEEverything is under /etc/puppetlabs,
/opt/puppetlabs, …
All-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: Pros
• EEEEEEEEEEEEEEEEEveryone gets the same ruby version
• OOOOOOOOOOOOOOOOOne RPM, one repository
• EEEEEEEEEEEEEEEEEverything can be optimized
• OOOOOOOOOOOOOOOOOnly one version to check for consistency
All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)
• NNNNNNNNNNNNNNNNNot rebuildable (toolchain
(ezbake/vanagon) not released/not
open-source)
• PPPPPPPPPPPPPPPPPL can patch Ruby, preventing people that
use other methods to get the same
behaviour
• WWWWWWWWWWWWWWWWWe are dependent on PL for updates (e.g
OpenSSL)
• HHHHHHHHHHHHHHHHHidden version numbers (Puppet-agent
version is semantic but abstract)
• NNNNNNNNNNNNNNNNNot reusing shared libs
All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)
• HHHHHHHHHHHHHHHHHow can we guess such paths?
/opt/puppetlabs/puppet/cache should
have been at least
/var/opt/puppetlabs/puppet
Batteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries included
• HHHHHHHHHHHHHHHHHiera, Augeas
• FFFFFFFFFFFFFFFFFacter, CFacter
• MMMMMMMMMMMMMMMMMcollective
• OOOOOOOOOOOOOOOOOpenSSL
• RRRRRRRRRRRRRRRRRuby and gem dependencies
The case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of Fedora
• FFFFFFFFFFFFFFFFFedora 23 ships Puppet 4
• NNNNNNNNNNNNNNNNNOT using the AIO package
• MMMMMMMMMMMMMMMMMight be rebuilt one day for EL
Migration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuff
Licensed under a Creative Commons Attribution-ShareAlike 2.0 License
https://www.flickr.com/photos/photos/26116471@N03/6362329323
PuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserver
• AAAAAAAAAAAAAAAAA Puppet master written in clojure
• RRRRRRRRRRRRRRRRRuns on top of a jvm
• PPPPPPPPPPPPPPPPPut it behind a reverse proxy
• SSSSSSSSSSSSSSSSSlow start but better performances
• NNNNNNNNNNNNNNNNNot much to say, it stays out of my way so
it's good
• PPPPPPPPPPPPPPPPPuppetserver 2.1 is compatible with Puppet
3 and 4 clients
Prepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourself
• UUUUUUUUUUUUUUUUUpdate to latest Puppet 3.x
• UUUUUUUUUUUUUUUUUse the Future parser
• UUUUUUUUUUUUUUUUUpdate to latest Puppetserver
Update your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clients
• hhhhhhhhhhhhhhhhhttps://github.com/puppetlabs/puppetlabs-
puppet_agent
• DDDDDDDDDDDDDDDDDo not forget to edit your cronjobs (change
PATH to /usr/bin:/opt/puppetlabs/bin)
• pppppppppppppppppuppet will be in /opt/puppetlabs/bin
Everything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yet
• PPPPPPPPPPPPPPPPPuppetboard and Foreman does not work
yet (new PuppetDB API)
• GGGGGGGGGGGGGGGGGood news: Puppetexplorer does (I have not
tested)
ConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusionConclusion
Licensed under a Creative Commons Attribution-ShareAlike 2.0 License
https://www.flickr.com/photos/olivierpechenet/19824185788
Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)
• GGGGGGGGGGGGGGGGGood job, Puppetlabs (and community)
• TTTTTTTTTTTTTTTTThe new DSL was a hard work
• IIIIIIIIIIIIIIIIIt works well
• IIIIIIIIIIIIIIIII have seen only minor bugs
• IIIIIIIIIIIIIIIIIt is still a lot backward-compatible (with
clean code…)
• PPPPPPPPPPPPPPPPPlease open-source the toolchain
Regarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSL
• AAAAAAAAAAAAAAAAA lot of new powers
• IIIIIIIIIIIIIIIIIt's a language
• TTTTTTTTTTTTTTTTTime to write new recommendations, best
practices
• IIIIIIIIIIIIIIIIIt can look awesome or horrible
• PPPPPPPPPPPPPPPPPuppet lint and code review to the rescue!
Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?
• IIIIIIIIIIIIIIIIIf you have a test environment, yes
• OOOOOOOOOOOOOOOOOtherwise I would still wait for more
bugfixes
• BBBBBBBBBBBBBBBBBut we are already at 4.2.1
• YYYYYYYYYYYYYYYYYou should a least prepare yourself
• IIIIIIIIIIIIIIIII recommend
github.com/theforeman/puppet-puppet to
manage puppet
The new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSL
• WWWWWWWWWWWWWWWWWill not be everywhere
• AAAAAAAAAAAAAAAAA lot of stuff could be done with stdlib
• FFFFFFFFFFFFFFFFFirst in roles, profiles, node manifests
• WWWWWWWWWWWWWWWWWaiting for PL to decomission 3.x for the
rest
• MMMMMMMMMMMMMMMMMaybe we will see puppet4-only modules
(but is that what we want?)
Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4
• FFFFFFFFFFFFFFFFFull of new features
• NNNNNNNNNNNNNNNNNow has a powerful DSL
• SSSSSSSSSSSSSSSSStays declarative
• IIIIIIIIIIIIIIIIIs more predictive
Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?
BioBioBioBioBioBioBioBioBioBioBioBioBioBioBioBioBio
• hhhhhhhhhhhhhhhhhttp://puppet-on-the-edge.blogspot.com/
• hhhhhhhhhhhhhhhhhttps://www.devco.net/
• hhhhhhhhhhhhhhhhhttp://docs.puppetlabs.com/
ContactContactContactContactContactContactContactContactContactContactContactContactContactContactContactContactContact
Julien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien Pivotto
julien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eu
@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie
inuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuits
https://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.eu
info@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.eu
+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636
1 of 84

Recommended

Managing a R&D Lab with Foreman by
Managing a R&D Lab with ForemanManaging a R&D Lab with Foreman
Managing a R&D Lab with ForemanJulien Pivotto
1.6K views91 slides
Puppet and software delivery by
Puppet and software deliveryPuppet and software delivery
Puppet and software deliveryJulien Pivotto
2K views48 slides
An introduction to the Pulp project by
An introduction to the Pulp projectAn introduction to the Pulp project
An introduction to the Pulp projectJulien Pivotto
9.6K views86 slides
Managing a R&D Lab with Foreman by
Managing a R&D Lab with ForemanManaging a R&D Lab with Foreman
Managing a R&D Lab with ForemanJulien Pivotto
1K views91 slides
Diving Into Puppet Providers Development: The Puppet-Corosync Module by
Diving Into Puppet Providers Development: The Puppet-Corosync ModuleDiving Into Puppet Providers Development: The Puppet-Corosync Module
Diving Into Puppet Providers Development: The Puppet-Corosync ModuleJulien Pivotto
2.1K views82 slides
A call to give back puppetlabs-corosync to the community by
A call to give back puppetlabs-corosync to the communityA call to give back puppetlabs-corosync to the community
A call to give back puppetlabs-corosync to the communityJulien Pivotto
2K views25 slides

More Related Content

What's hot

Demystifying the Foreman by
Demystifying the ForemanDemystifying the Foreman
Demystifying the ForemanJulien Pivotto
2.1K views40 slides
Coworking with git by
Coworking with gitCoworking with git
Coworking with gitJulien Pivotto
2.7K views58 slides
RPM experiments by
RPM experimentsRPM experiments
RPM experimentsJulien Pivotto
1.6K views42 slides
Getting the maximum out of systemd by
Getting the maximum out of systemdGetting the maximum out of systemd
Getting the maximum out of systemdJulien Pivotto
8.6K views75 slides
Monitoring at Cloud Scale by
Monitoring at Cloud ScaleMonitoring at Cloud Scale
Monitoring at Cloud ScaleJulien Pivotto
8.5K views47 slides
Enhance OpenSSH for fun and security by
Enhance OpenSSH for fun and securityEnhance OpenSSH for fun and security
Enhance OpenSSH for fun and securityJulien Pivotto
1.8K views72 slides

What's hot(20)

Getting the maximum out of systemd by Julien Pivotto
Getting the maximum out of systemdGetting the maximum out of systemd
Getting the maximum out of systemd
Julien Pivotto8.6K views
Monitoring at Cloud Scale by Julien Pivotto
Monitoring at Cloud ScaleMonitoring at Cloud Scale
Monitoring at Cloud Scale
Julien Pivotto8.5K views
Enhance OpenSSH for fun and security by Julien Pivotto
Enhance OpenSSH for fun and securityEnhance OpenSSH for fun and security
Enhance OpenSSH for fun and security
Julien Pivotto1.8K views
systemd and configuration management by Julien Pivotto
systemd and configuration managementsystemd and configuration management
systemd and configuration management
Julien Pivotto2.9K views
OSDC 2016 - Automating a R&D lab with Foreman: What can be hard? by Julien Pi... by NETWAYS
OSDC 2016 - Automating a R&D lab with Foreman: What can be hard? by Julien Pi...OSDC 2016 - Automating a R&D lab with Foreman: What can be hard? by Julien Pi...
OSDC 2016 - Automating a R&D lab with Foreman: What can be hard? by Julien Pi...
NETWAYS143 views
We Buy Cheese in a Cheese Shop by Tzu-ping Chung
We Buy Cheese in a Cheese ShopWe Buy Cheese in a Cheese Shop
We Buy Cheese in a Cheese Shop
Tzu-ping Chung904 views
Destruction, Decapods and Doughnuts: Continuous Delivery for Audio & Video Fa... by Rachel Evans
Destruction, Decapods and Doughnuts: Continuous Delivery for Audio & Video Fa...Destruction, Decapods and Doughnuts: Continuous Delivery for Audio & Video Fa...
Destruction, Decapods and Doughnuts: Continuous Delivery for Audio & Video Fa...
Rachel Evans844 views
Tracking large game assets with Git LFS by Tim Pettersen
Tracking large game assets with Git LFSTracking large game assets with Git LFS
Tracking large game assets with Git LFS
Tim Pettersen849 views
Arduino programming of ML-style in ATS by Kiwamu Okabe
Arduino programming of ML-style in ATSArduino programming of ML-style in ATS
Arduino programming of ML-style in ATS
Kiwamu Okabe11K views
떠먹는 '오브젝트' Ch05 책임 할당하기 by Covenant Ko
떠먹는 '오브젝트' Ch05 책임 할당하기떠먹는 '오브젝트' Ch05 책임 할당하기
떠먹는 '오브젝트' Ch05 책임 할당하기
Covenant Ko954 views
Tracking huge files with Git LFS - LinuxCon 2016 by Tim Pettersen
Tracking huge files with Git LFS - LinuxCon 2016Tracking huge files with Git LFS - LinuxCon 2016
Tracking huge files with Git LFS - LinuxCon 2016
Tim Pettersen404 views
Metasepi team meeting #20: Start! ATS programming on MCU by Kiwamu Okabe
Metasepi team meeting #20: Start! ATS programming on MCUMetasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCU
Kiwamu Okabe14.8K views
Functional IoT: Hardware and Platform by Kiwamu Okabe
Functional IoT: Hardware and PlatformFunctional IoT: Hardware and Platform
Functional IoT: Hardware and Platform
Kiwamu Okabe1.6K views
Hands-on VeriFast with STM32 microcontroller by Kiwamu Okabe
Hands-on VeriFast with STM32 microcontrollerHands-on VeriFast with STM32 microcontroller
Hands-on VeriFast with STM32 microcontroller
Kiwamu Okabe1.6K views
Metasepi team meeting #16: Safety on ATS language + MCU by Kiwamu Okabe
Metasepi team meeting #16: Safety on ATS language + MCUMetasepi team meeting #16: Safety on ATS language + MCU
Metasepi team meeting #16: Safety on ATS language + MCU
Kiwamu Okabe15.1K views

Similar to Dive into Puppet 4

Python environments by
Python environmentsPython environments
Python environmentsGlen Zangirolami
895 views36 slides
Pinto+Stratopan+Love by
Pinto+Stratopan+LovePinto+Stratopan+Love
Pinto+Stratopan+LoveJeffrey Ryan Thalhammer
1.1K views115 slides
Nicolas Pastorino - The Open-source roar in the eZ Community by
Nicolas Pastorino - The Open-source roar in the eZ CommunityNicolas Pastorino - The Open-source roar in the eZ Community
Nicolas Pastorino - The Open-source roar in the eZ CommunityNicolas Pastorino
1.5K views102 slides
Code is so much more... by
Code is so much more...Code is so much more...
Code is so much more...Praveen Puglia
123 views84 slides
Devops -- LKFR14 by
Devops -- LKFR14Devops -- LKFR14
Devops -- LKFR14Lean Kanban France
103 views96 slides
Migrating to Puppet 5 by
Migrating to Puppet 5Migrating to Puppet 5
Migrating to Puppet 5Kris Buytaert
1K views34 slides

Similar to Dive into Puppet 4(20)

Nicolas Pastorino - The Open-source roar in the eZ Community by Nicolas Pastorino
Nicolas Pastorino - The Open-source roar in the eZ CommunityNicolas Pastorino - The Open-source roar in the eZ Community
Nicolas Pastorino - The Open-source roar in the eZ Community
Nicolas Pastorino1.5K views
Introduction to Gitlab by Julien Pivotto
Introduction to GitlabIntroduction to Gitlab
Introduction to Gitlab
Julien Pivotto20.7K views
Minou Minou ! Les chat(bot)s continuent leur invasion de l'INTERNET by Maxime Pawlak
Minou Minou ! Les chat(bot)s continuent leur invasion de l'INTERNETMinou Minou ! Les chat(bot)s continuent leur invasion de l'INTERNET
Minou Minou ! Les chat(bot)s continuent leur invasion de l'INTERNET
Maxime Pawlak455 views
DrupalCamp Arad - Drupal 7 as a framework - an overview of available APIs by Valentin Bora
DrupalCamp Arad - Drupal 7 as a framework - an overview of available APIsDrupalCamp Arad - Drupal 7 as a framework - an overview of available APIs
DrupalCamp Arad - Drupal 7 as a framework - an overview of available APIs
Valentin Bora688 views
Dont bid on this question if you are not a python expert!!!!!!!!!!!! by joney4
Dont bid on this question if you are not a python expert!!!!!!!!!!!!Dont bid on this question if you are not a python expert!!!!!!!!!!!!
Dont bid on this question if you are not a python expert!!!!!!!!!!!!
joney426 views
Olmec guesstheartifactgameengagingpp twithpicturescluesanswers by prbroome
Olmec guesstheartifactgameengagingpp twithpicturescluesanswersOlmec guesstheartifactgameengagingpp twithpicturescluesanswers
Olmec guesstheartifactgameengagingpp twithpicturescluesanswers
prbroome134 views
图解Git by Tony Deng
图解Git图解Git
图解Git
Tony Deng486 views
Spring, CDI, Jakarta EE good parts by Jarek Ratajski
Spring, CDI, Jakarta EE good partsSpring, CDI, Jakarta EE good parts
Spring, CDI, Jakarta EE good parts
Jarek Ratajski417 views
The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2... by Ruth Everett
The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...
The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...
Ruth Everett4.9K views

More from Julien Pivotto

The O11y Toolkit by
The O11y ToolkitThe O11y Toolkit
The O11y ToolkitJulien Pivotto
38 views24 slides
What's New in Prometheus and Its Ecosystem by
What's New in Prometheus and Its EcosystemWhat's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its EcosystemJulien Pivotto
12 views42 slides
Prometheus: What is is, what is new, what is coming by
Prometheus: What is is, what is new, what is comingPrometheus: What is is, what is new, what is coming
Prometheus: What is is, what is new, what is comingJulien Pivotto
43 views27 slides
What's new in Prometheus? by
What's new in Prometheus?What's new in Prometheus?
What's new in Prometheus?Julien Pivotto
15 views10 slides
Introduction to Grafana Loki by
Introduction to Grafana LokiIntroduction to Grafana Loki
Introduction to Grafana LokiJulien Pivotto
199 views11 slides
Why you should revisit mgmt by
Why you should revisit mgmtWhy you should revisit mgmt
Why you should revisit mgmtJulien Pivotto
10 views46 slides

More from Julien Pivotto(20)

What's New in Prometheus and Its Ecosystem by Julien Pivotto
What's New in Prometheus and Its EcosystemWhat's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its Ecosystem
Julien Pivotto12 views
Prometheus: What is is, what is new, what is coming by Julien Pivotto
Prometheus: What is is, what is new, what is comingPrometheus: What is is, what is new, what is coming
Prometheus: What is is, what is new, what is coming
Julien Pivotto43 views
Introduction to Grafana Loki by Julien Pivotto
Introduction to Grafana LokiIntroduction to Grafana Loki
Introduction to Grafana Loki
Julien Pivotto199 views
Observing the HashiCorp Ecosystem From Prometheus by Julien Pivotto
Observing the HashiCorp Ecosystem From PrometheusObserving the HashiCorp Ecosystem From Prometheus
Observing the HashiCorp Ecosystem From Prometheus
Julien Pivotto37 views
Monitoring in a fast-changing world with Prometheus by Julien Pivotto
Monitoring in a fast-changing world with PrometheusMonitoring in a fast-changing world with Prometheus
Monitoring in a fast-changing world with Prometheus
Julien Pivotto33 views
5 tips for Prometheus Service Discovery by Julien Pivotto
5 tips for Prometheus Service Discovery5 tips for Prometheus Service Discovery
5 tips for Prometheus Service Discovery
Julien Pivotto38 views
Prometheus and TLS - an Introduction by Julien Pivotto
Prometheus and TLS - an IntroductionPrometheus and TLS - an Introduction
Prometheus and TLS - an Introduction
Julien Pivotto15 views
HAProxy as Egress Controller by Julien Pivotto
HAProxy as Egress ControllerHAProxy as Egress Controller
HAProxy as Egress Controller
Julien Pivotto2.9K views
Improved alerting with Prometheus and Alertmanager by Julien Pivotto
Improved alerting with Prometheus and AlertmanagerImproved alerting with Prometheus and Alertmanager
Improved alerting with Prometheus and Alertmanager
Julien Pivotto4.5K views
SIngle Sign On with Keycloak by Julien Pivotto
SIngle Sign On with KeycloakSIngle Sign On with Keycloak
SIngle Sign On with Keycloak
Julien Pivotto10K views
Monitoring as an entry point for collaboration by Julien Pivotto
Monitoring as an entry point for collaborationMonitoring as an entry point for collaboration
Monitoring as an entry point for collaboration
Julien Pivotto1.3K views
Monitor your CentOS stack with Prometheus by Julien Pivotto
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with Prometheus
Julien Pivotto712 views
Monitor your CentOS stack with Prometheus by Julien Pivotto
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with Prometheus
Julien Pivotto704 views

Recently uploaded

"Surviving highload with Node.js", Andrii Shumada by
"Surviving highload with Node.js", Andrii Shumada "Surviving highload with Node.js", Andrii Shumada
"Surviving highload with Node.js", Andrii Shumada Fwdays
53 views29 slides
Igniting Next Level Productivity with AI-Infused Data Integration Workflows by
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Safe Software
385 views86 slides
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti... by
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...ShapeBlue
98 views29 slides
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueShapeBlue
179 views7 slides
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava... by
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...ShapeBlue
101 views17 slides
Future of AR - Facebook Presentation by
Future of AR - Facebook PresentationFuture of AR - Facebook Presentation
Future of AR - Facebook PresentationRob McCarty
62 views27 slides

Recently uploaded(20)

"Surviving highload with Node.js", Andrii Shumada by Fwdays
"Surviving highload with Node.js", Andrii Shumada "Surviving highload with Node.js", Andrii Shumada
"Surviving highload with Node.js", Andrii Shumada
Fwdays53 views
Igniting Next Level Productivity with AI-Infused Data Integration Workflows by Safe Software
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Safe Software385 views
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti... by ShapeBlue
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
ShapeBlue98 views
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
ShapeBlue179 views
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava... by ShapeBlue
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
ShapeBlue101 views
Future of AR - Facebook Presentation by Rob McCarty
Future of AR - Facebook PresentationFuture of AR - Facebook Presentation
Future of AR - Facebook Presentation
Rob McCarty62 views
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue by ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
ShapeBlue103 views
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online by ShapeBlue
KVM Security Groups Under the Hood - Wido den Hollander - Your.OnlineKVM Security Groups Under the Hood - Wido den Hollander - Your.Online
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online
ShapeBlue181 views
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha... by ShapeBlue
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
ShapeBlue138 views
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
ShapeBlue93 views
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ... by ShapeBlue
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...
ShapeBlue79 views
Digital Personal Data Protection (DPDP) Practical Approach For CISOs by Priyanka Aash
Digital Personal Data Protection (DPDP) Practical Approach For CISOsDigital Personal Data Protection (DPDP) Practical Approach For CISOs
Digital Personal Data Protection (DPDP) Practical Approach For CISOs
Priyanka Aash153 views
NTGapps NTG LowCode Platform by Mustafa Kuğu
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform
Mustafa Kuğu365 views
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit... by ShapeBlue
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
ShapeBlue117 views
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by ShapeBlue
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
ShapeBlue85 views

Dive into Puppet 4

  • 1. Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4Dive into Puppet 4 A new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetizeA new way to puppetize Julien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien Pivotto Belgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User GroupBelgian Puppet User Group September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015September 10, 2015
  • 2. $::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user Julien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien Pivotto • Open-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.euOpen-Source consultant at inuits.eu • Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011Puppet User since 2011 • Speaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at PuppetcampsSpeaker/attendee at Puppetcamps • Member of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUGMember of the Belgian PUG • Puppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributorPuppet core contributor • Puppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributorPuppet(labs) modules contributor • @roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie on irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/githubon irc/twitter/github
  • 5. Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011Puppetmaster since 2011 • PPPPPPPPPPPPPPPPPuppet 2.6/2.7 • RRRRRRRRRRRRRRRRReports stored with activerecord • PPPPPPPPPPPPPPPPPuppet Dashboard • NNNNNNNNNNNNNNNNNo hiera • NNNNNNNNNNNNNNNNNo PuppetDB
  • 6. Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011Puppet 2.7 - June 2011 • RRRRRRRRRRRRRRRRRuby 1.9 support • AAAAAAAAAAAAAAAAApache 2.0 Licence • TTTTTTTTTTTTTTTTThe end of "random" catalog order • SSSSSSSSSSSSSSSSSupport for network devices • DDDDDDDDDDDDDDDDDeprecation of dynamic variables
  • 7. Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012Puppet 3.0.0 - October 2012 • SSSSSSSSSSSSSSSSSupport for 3rd parties gems • NNNNNNNNNNNNNNNNNative hiera support • AAAAAAAAAAAAAAAAAutomatic hiera lookups • RRRRRRRRRRRRRRRRRemove dynamic scope lookup • SSSSSSSSSSSSSSSSSemantic versioning
  • 8. Puppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x seriesPuppet 3.x series • FFFFFFFFFFFFFFFFFuture parser (3.2.0) • """""""""""""""""contain" keyword (3.4.0) • dddddddddddddddddirectory environments (3.5.0)
  • 9. Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4 Licensed under a Creative Commons Attribution 2.0 License https://www.flickr.com/photos/mujitra/4421810399
  • 10. The big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big pictureThe big picture • NNNNNNNNNNNNNNNNNew DSL language • AAAAAAAAAAAAAAAAAll-in-one Package • PPPPPPPPPPPPPPPPPuppetserver
  • 11. A new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSLA new DSL Apache 2.0 License https://github.com/ke4qqq/puppet-cloudstack
  • 12. Domain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific LanguageDomain Specific Language The goal of the Puppet DSL stays the same: describe the final state of your infrastructure.
  • 13. The new DSL gets closer to other programming languages: types, iterations, predictive ordering…
  • 14. OrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrdering Licensed under a Creative Commons Attribution-ShareAlike 2.0 License https://www.flickr.com/photos/lambertclement/19543885696
  • 15. order.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pporder.pp notify { ’ B e l g i a n ’ : } notify { ’ Puppet ’ : } notify { ’ User ’ : } notify { ’ Group ’ : }
  • 16. Puppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.xPuppet 3.x Notice: Compiled catalog for nitrogen in environment production in 0.02 seconds Notice: User Notice: /Stage[main]/Main/Notify[User]/message: defined 'message ' as 'User ' Notice: Belgian Notice: /Stage[main]/Main/Notify[Belgian]/message: defined 'message ' as 'Belgian ' Notice: Group Notice: /Stage[main]/Main/Notify[Group]/message: defined 'message ' as 'Group ' Notice: Puppet Notice: /Stage[main]/Main/Notify[Puppet]/message: defined 'message ' as 'Puppet ' Notice: Finished catalog run in 0.02 seconds
  • 17. Puppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.xPuppet 4.x Notice: Compiled catalog for nitrogen in environment production in 0.23 seconds Notice: Belgian Notice: /Stage[main]/Main/Notify[Belgian]/message: defined 'message ' as 'Belgian ' Notice: Puppet Notice: /Stage[main]/Main/Notify[Puppet]/message: defined 'message ' as 'Puppet ' Notice: User Notice: /Stage[main]/Main/Notify[User]/message: defined 'message ' as 'User ' Notice: Group Notice: /Stage[main]/Main/Notify[Group]/message: defined 'message ' as 'Group ' Notice: Applied catalog in 0.01 seconds
  • 18. OrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrderingOrdering • AAAAAAAAAAAAAAAAAlways the same order • PPPPPPPPPPPPPPPPPuppet 3.x: based on title-hash • PPPPPPPPPPPPPPPPPuppet 4.x: order seen in the manifest
  • 19. Puppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 orderingPuppet 4 ordering • TTTTTTTTTTTTTTTTTime saver • """""""""""""""""Hides" complexity • AAAAAAAAAAAAAAAAAlign with other languages • SSSSSSSSSSSSSSSSStill supports Require, Notify, … • """""""""""""""""real" dependencies should still be explicitely set (e.g cron job only installed if packages is installed)
  • 20. (Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types(Native) Data Types Licensed under a Creative Commons Attribution 2.0 License https://www.flickr.com/photos/ionics/6338281766
  • 21. Data types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not newData types are not new • PPPPPPPPPPPPPPPPPreviously included in stdlib, 3rd party module • ssssssssssssssssstdlib contains functions to convert data types, check data types • NNNNNNNNNNNNNNNNNothing in Puppet Core • DDDDDDDDDDDDDDDDDifficult to check the type of all the parameters
  • 22. Data TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData TypesData Types String Numeric: Integer, Float Boolean Array Hash Regexp Undef Catalogentry: Class, Resource
  • 23. StringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringString String Any string String[2] Any string with at least 2 characters String[0,2] A string with at most 2 characters String[4,6] A string with at least 4 and at most 6 characters String[5,5] A string with 5 characters Convert to string with: "${myvariable}"
  • 24. NumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumericNumeric Numeric Float or integer Numeric[-1,1] Float or Integer between -1 and 1 (incl) Integer Any integer (from −∞ to ∞) Integer[0] Positive Integer Integer[default, 0] Negative Integer Integer[-1,1] Integer between -1 and 1 (incl) Float Floating point number Float[-3,3.14] Float between -3 and 3.14 (incl) Convert to Integer with the scanf function or 0+$variable
  • 25. HashHashHashHashHashHashHashHashHashHashHashHashHashHashHashHashHash Hash A Hash (key, value pairs) Hash[String, String] Hash with String as keys and values Hash[String, Integer] String as keys, Integer as values Hash[String, Integer, 1] Non empty hash Hash[String, Integer, default, 5] Hash with at most 5 entries
  • 26. ArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArray Array An array (list) Array[String] Array with String Array[String, 1] Non empty Array Array[String, default, 5] Array with at most 5 entries
  • 27. UndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndefUndef Eventually! A clear type for Undef (was very confusing in the past: nil? string? symbol?)
  • 28. Abstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data TypesAbstract Data Types Licensed under a Creative Commons Attribution 2.0 License https://www.flickr.com/photos/webtreatsetc/4666231979
  • 39. Playing with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with typesPlaying with types Licensed under a Creative Commons Attribution 2.0 License https://www.flickr.com/photos/jdhancock/7439512656
  • 40. Types in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditionsTypes in conditions # Comparison i f $m =~ Boolean { $manage = $m } e l s i f $m !~ Enum [ ’ t r u e ’ , ’ f a l s e ’ ] { f a i l ( ’ Bad v a l u e ’ ) }
  • 41. Types in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statementsTypes in case statements case $user { I n t e g e r : { $uid = $user } Boolean : { $ c r e a t e = $user } d e f a u l t : { f a i l ( ’ Bad Data Type ’ ) } }
  • 42. Types in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parametersTypes in parameters class p r o f i l e _ m y s q l ( Boolean $manage_service, Enum [ ’ mysql ’ , ’ mariadb ’ ] $service_name, Optional [ S t r i n g [ 8 ] ] $root_password, ) { }
  • 43. Type checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checking # NOT CORRECT: S t r i n g $runmode = $ f a c t s [ ’ runmode ’ ] # Corre ct : $runmode = a s s e r t _ t y p e ( S t r i n g , $ f a c t s [ ’ runmode ’ ] )
  • 44. Array, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash mergeArray, Hash merge Licensed under a Creative Commons Attribution 2.0 License https://www.flickr.com/photos/willmx/2295022876
  • 45. HashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashesHashes $mascot1 = { ’ l i n u x ’ => ’ tux ’ } $mascot2 = { ’ bsd ’ => ’ b e a s t i e ’ } $mascots = $mascot1 + $mascot2 # { ’ l i n u x ’ => ’ tux ’ , ’ bsd ’ => ’ b e a s t i e ’ }
  • 46. ArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArraysArrays $ d i s t r o = [ ’ Larry ’ , ’ Geeko ’ ] $misc = [ ’ b l i n k y ’ , ’ f r e d ’ ] $ a l l = $ d i s t r o + $misc # [ ’ Larry ’ , ’ Geeko ’ , ’ b l i n k y ’ , ’ f r e d ’ ]
  • 49. Puppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 Function # http :// puppet−on−the−edge . blogspot . se Puppet : : Functions . c r e a t e _ f u n c t i o n ( : min ) do d i s p a t c h : min do param ’ Numeric ’ , : a param ’ Numeric ’ , : b end def min ( x , y ) x <= y ? x : y end end
  • 50. Puppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 FunctionPuppet 4 Function # http :// puppet−on−the−edge . blogspot . se Puppet : : Functions . create_function ( : min) do dispatch : min do param ’ Numeric ’ , : a param ’ Numeric ’ , : b end dispatch : min_s do param ’ String ’ , : s1 param ’ String ’ , : s2 end def min(x , y) x <= y ? x : y end def min_s(x , y) cmp = (x . downcase <=> y . downcase ) cmp <= 0 ? x : y end end
  • 51. Loops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functionsLoops and new built-in functions Licensed under a Creative Commons Attribution-ShareAlike 2.0 License https://www.flickr.com/photos/squeaks2569/8114399667
  • 52. Loops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: ArrayLoops: Array class vh o s t s ( Array [ S t r i n g ] $packages, ) { $packages . each | S t r i n g $package | { package { ” vhost−${package} ” : ensure => p r e s e n t , } } }
  • 53. Loops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: HashLoops: Hash class vhosts (Hash[String, String] $packages,){ $packages.each | String $package, String $version | { package { "vhost−${package}": ensure => $version, } } }
  • 54. Loops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduceLoops: reduce $total = reduce([1,2,3]) |$result, $value| { $result + $value } # $total = 6
  • 55. with: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scopewith: "private" scope # ’ p r i v a t e ’ v a r i a b l e s with ( ’ ldap ’ , ’ s e c r e t ’ ) | $ u s e r , $password | { f i l e { ’ / etc / s e c r e t s ’ : content => ” ${user} : $ { s e c r e t } ” , } }
  • 56. filterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilterfilter class vhosts (Hash[String, String] $packages,){ $packages.filter | String $package, String $version | { $version != 'latest' }.each | String $package, String $version | { package { "vhost−${package}": ensure => $version, } } }
  • 57. access resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parametersaccess resource parameters class vhosts (Hash[String, String] $packages,){ $packages.filter | String $package, String $version | { $version != 'latest' }.each | String $package, String $version | { package { "vhost−${package}": ensure => $version, } } $foo_version = Package["foo"]["version"] }
  • 58. ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining)ruby-style . syntax (chaining) $a = join(['foo', 'bar'], ',') $b = ['foo', 'bar'].join(',')
  • 59. HEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOCHEREDOC # HEREDOC $longstring = @(EOM) This item is managed by Puppet EOM # Remove tabs $longstring_notabs = @(EOM) This item is managed by Puppet | EOM # Remove new lines + trailing line $longstring_nonewline = @(EOM) This item is managed by Puppet |− EOM # Syntax check $longstring_nonewline = @(EOM:json) ["This item is managed by Puppet"] |− EOM
  • 61. TemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplatesTemplates • CCCCCCCCCCCCCCCCCan be written in Puppet Code (EPP) • GGGGGGGGGGGGGGGGGets their own variables • OOOOOOOOOOOOOOOOOnly useful since the new DSL • fffffffffffffffffunction epp and inline_epp
  • 62. EPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templates f i l e { ’ pt−heartbeat −c o n f i g ’ : show_diff => f a l s e , content => epp ( ’ pth / pth . epp ’ , { database => $ d a t a b a s e , socket => $ s o c k e t , u s e r => $ u s e r , password => $password, } ) , }
  • 63. EPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templatesEPP templates <%− | S t r i n g $database , S t r i n g $password , S t r i n g $socket , S t r i n g $user , | −%> u s e r=<%= $user %> password=<%= $password %> socket=<%= $socket %> database=<%= $database %> host=l o c a l h o s t create −t a b l e
  • 64. All-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One packageAll-in-One package Licensed under a Creative Commons Attribution 2.0 License https://www.flickr.com/photos/creative_tools/5299374697
  • 65. All-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: FactsAll-in-One package: Facts • AAAAAAAAAAAAAAAAAll the client is in one RPM • RRRRRRRRRRRRRRRRRepository is called PC1 • PPPPPPPPPPPPPPPPPuppet Collection 1 • pppppppppppppppppuppet-agent RPM contains ruby and all the deps • EEEEEEEEEEEEEEEEEverything is under /etc/puppetlabs, /opt/puppetlabs, …
  • 66. All-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: ProsAll-in-One package: Pros • EEEEEEEEEEEEEEEEEveryone gets the same ruby version • OOOOOOOOOOOOOOOOOne RPM, one repository • EEEEEEEEEEEEEEEEEverything can be optimized • OOOOOOOOOOOOOOOOOnly one version to check for consistency
  • 67. All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2)All-in-One package: Cons (1/2) • NNNNNNNNNNNNNNNNNot rebuildable (toolchain (ezbake/vanagon) not released/not open-source) • PPPPPPPPPPPPPPPPPL can patch Ruby, preventing people that use other methods to get the same behaviour • WWWWWWWWWWWWWWWWWe are dependent on PL for updates (e.g OpenSSL) • HHHHHHHHHHHHHHHHHidden version numbers (Puppet-agent version is semantic but abstract) • NNNNNNNNNNNNNNNNNot reusing shared libs
  • 68. All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2)All-in-One package: Cons (2/2) • HHHHHHHHHHHHHHHHHow can we guess such paths? /opt/puppetlabs/puppet/cache should have been at least /var/opt/puppetlabs/puppet
  • 69. Batteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries includedBatteries included • HHHHHHHHHHHHHHHHHiera, Augeas • FFFFFFFFFFFFFFFFFacter, CFacter • MMMMMMMMMMMMMMMMMcollective • OOOOOOOOOOOOOOOOOpenSSL • RRRRRRRRRRRRRRRRRuby and gem dependencies
  • 70. The case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of FedoraThe case of Fedora • FFFFFFFFFFFFFFFFFedora 23 ships Puppet 4 • NNNNNNNNNNNNNNNNNOT using the AIO package • MMMMMMMMMMMMMMMMMight be rebuilt one day for EL
  • 71. Migration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuffMigration and stuff Licensed under a Creative Commons Attribution-ShareAlike 2.0 License https://www.flickr.com/photos/photos/26116471@N03/6362329323
  • 72. PuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserverPuppetserver • AAAAAAAAAAAAAAAAA Puppet master written in clojure • RRRRRRRRRRRRRRRRRuns on top of a jvm • PPPPPPPPPPPPPPPPPut it behind a reverse proxy • SSSSSSSSSSSSSSSSSlow start but better performances • NNNNNNNNNNNNNNNNNot much to say, it stays out of my way so it's good • PPPPPPPPPPPPPPPPPuppetserver 2.1 is compatible with Puppet 3 and 4 clients
  • 73. Prepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourselfPrepare yourself • UUUUUUUUUUUUUUUUUpdate to latest Puppet 3.x • UUUUUUUUUUUUUUUUUse the Future parser • UUUUUUUUUUUUUUUUUpdate to latest Puppetserver
  • 74. Update your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clientsUpdate your clients • hhhhhhhhhhhhhhhhhttps://github.com/puppetlabs/puppetlabs- puppet_agent • DDDDDDDDDDDDDDDDDo not forget to edit your cronjobs (change PATH to /usr/bin:/opt/puppetlabs/bin) • pppppppppppppppppuppet will be in /opt/puppetlabs/bin
  • 75. Everything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yetEverything is not there yet • PPPPPPPPPPPPPPPPPuppetboard and Foreman does not work yet (new PuppetDB API) • GGGGGGGGGGGGGGGGGood news: Puppetexplorer does (I have not tested)
  • 77. Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-)Good job :-) • GGGGGGGGGGGGGGGGGood job, Puppetlabs (and community) • TTTTTTTTTTTTTTTTThe new DSL was a hard work • IIIIIIIIIIIIIIIIIt works well • IIIIIIIIIIIIIIIII have seen only minor bugs • IIIIIIIIIIIIIIIIIt is still a lot backward-compatible (with clean code…) • PPPPPPPPPPPPPPPPPlease open-source the toolchain
  • 78. Regarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSLRegarding the new DSL • AAAAAAAAAAAAAAAAA lot of new powers • IIIIIIIIIIIIIIIIIt's a language • TTTTTTTTTTTTTTTTTime to write new recommendations, best practices • IIIIIIIIIIIIIIIIIt can look awesome or horrible • PPPPPPPPPPPPPPPPPuppet lint and code review to the rescue!
  • 79. Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move?Is it time to move? • IIIIIIIIIIIIIIIIIf you have a test environment, yes • OOOOOOOOOOOOOOOOOtherwise I would still wait for more bugfixes • BBBBBBBBBBBBBBBBBut we are already at 4.2.1 • YYYYYYYYYYYYYYYYYou should a least prepare yourself • IIIIIIIIIIIIIIIII recommend github.com/theforeman/puppet-puppet to manage puppet
  • 80. The new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSLThe new DSL • WWWWWWWWWWWWWWWWWill not be everywhere • AAAAAAAAAAAAAAAAA lot of stuff could be done with stdlib • FFFFFFFFFFFFFFFFFirst in roles, profiles, node manifests • WWWWWWWWWWWWWWWWWaiting for PL to decomission 3.x for the rest • MMMMMMMMMMMMMMMMMaybe we will see puppet4-only modules (but is that what we want?)
  • 81. Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4Puppet 4 • FFFFFFFFFFFFFFFFFull of new features • NNNNNNNNNNNNNNNNNow has a powerful DSL • SSSSSSSSSSSSSSSSStays declarative • IIIIIIIIIIIIIIIIIs more predictive
  • 82. Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?Any Question?
  • 84. ContactContactContactContactContactContactContactContactContactContactContactContactContactContactContactContactContact Julien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien Pivotto julien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eujulien@inuits.eu @roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie@roidelapluie inuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuits https://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.euhttps://inuits.eu info@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.euinfo@inuits.eu +32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636+32 473 441 636