SlideShare a Scribd company logo
1 of 84
Download to read offline
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

More Related Content

What's hot

Demystifying the Foreman
Demystifying the ForemanDemystifying the Foreman
Demystifying the ForemanJulien Pivotto
 
Getting the maximum out of systemd
Getting the maximum out of systemdGetting the maximum out of systemd
Getting the maximum out of systemdJulien Pivotto
 
Monitoring at Cloud Scale
Monitoring at Cloud ScaleMonitoring at Cloud Scale
Monitoring at Cloud ScaleJulien Pivotto
 
Enhance OpenSSH for fun and security
Enhance OpenSSH for fun and securityEnhance OpenSSH for fun and security
Enhance OpenSSH for fun and securityJulien Pivotto
 
systemd and configuration management
systemd and configuration managementsystemd and configuration management
systemd and configuration managementJulien Pivotto
 
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...
OSDC 2016 - Automating a R&D lab with Foreman: What can be hard? by Julien Pi...NETWAYS
 
We Buy Cheese in a Cheese Shop
We Buy Cheese in a Cheese ShopWe Buy Cheese in a Cheese Shop
We Buy Cheese in a Cheese ShopTzu-ping Chung
 
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...
Destruction, Decapods and Doughnuts: Continuous Delivery for Audio & Video Fa...Rachel Evans
 
Tracking large game assets with Git LFS
Tracking large game assets with Git LFSTracking large game assets with Git LFS
Tracking large game assets with Git LFSTim Pettersen
 
Arduino programming of ML-style in ATS
Arduino programming of ML-style in ATSArduino programming of ML-style in ATS
Arduino programming of ML-style in ATSKiwamu Okabe
 
떠먹는 '오브젝트' Ch05 책임 할당하기
떠먹는 '오브젝트' Ch05 책임 할당하기떠먹는 '오브젝트' Ch05 책임 할당하기
떠먹는 '오브젝트' Ch05 책임 할당하기Covenant Ko
 
Tracking huge files with Git LFS - LinuxCon 2016
Tracking huge files with Git LFS - LinuxCon 2016Tracking huge files with Git LFS - LinuxCon 2016
Tracking huge files with Git LFS - LinuxCon 2016Tim Pettersen
 
Metasepi team meeting #20: Start! ATS programming on MCU
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 MCUKiwamu Okabe
 
Functional IoT: Hardware and Platform
Functional IoT: Hardware and PlatformFunctional IoT: Hardware and Platform
Functional IoT: Hardware and PlatformKiwamu Okabe
 
Hands-on VeriFast with STM32 microcontroller
Hands-on VeriFast with STM32 microcontrollerHands-on VeriFast with STM32 microcontroller
Hands-on VeriFast with STM32 microcontrollerKiwamu Okabe
 
Metasepi team meeting #16: Safety on ATS language + MCU
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 + MCUKiwamu Okabe
 

What's hot (20)

Demystifying the Foreman
Demystifying the ForemanDemystifying the Foreman
Demystifying the Foreman
 
Coworking with git
Coworking with gitCoworking with git
Coworking with git
 
RPM experiments
RPM experimentsRPM experiments
RPM experiments
 
Getting the maximum out of systemd
Getting the maximum out of systemdGetting the maximum out of systemd
Getting the maximum out of systemd
 
Monitoring at Cloud Scale
Monitoring at Cloud ScaleMonitoring at Cloud Scale
Monitoring at Cloud Scale
 
Enhance OpenSSH for fun and security
Enhance OpenSSH for fun and securityEnhance OpenSSH for fun and security
Enhance OpenSSH for fun and security
 
DNSSec
DNSSecDNSSec
DNSSec
 
systemd and configuration management
systemd and configuration managementsystemd and configuration management
systemd and configuration management
 
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...
OSDC 2016 - Automating a R&D lab with Foreman: What can be hard? by Julien Pi...
 
We Buy Cheese in a Cheese Shop
We Buy Cheese in a Cheese ShopWe Buy Cheese in a Cheese Shop
We Buy Cheese in a Cheese Shop
 
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...
Destruction, Decapods and Doughnuts: Continuous Delivery for Audio & Video Fa...
 
Tracking large game assets with Git LFS
Tracking large game assets with Git LFSTracking large game assets with Git LFS
Tracking large game assets with Git LFS
 
Arduino programming of ML-style in ATS
Arduino programming of ML-style in ATSArduino programming of ML-style in ATS
Arduino programming of ML-style in ATS
 
Git and Unity
Git and UnityGit and Unity
Git and Unity
 
떠먹는 '오브젝트' Ch05 책임 할당하기
떠먹는 '오브젝트' Ch05 책임 할당하기떠먹는 '오브젝트' Ch05 책임 할당하기
떠먹는 '오브젝트' Ch05 책임 할당하기
 
Tracking huge files with Git LFS - LinuxCon 2016
Tracking huge files with Git LFS - LinuxCon 2016Tracking huge files with Git LFS - LinuxCon 2016
Tracking huge files with Git LFS - LinuxCon 2016
 
Metasepi team meeting #20: Start! ATS programming on MCU
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
 
Functional IoT: Hardware and Platform
Functional IoT: Hardware and PlatformFunctional IoT: Hardware and Platform
Functional IoT: Hardware and Platform
 
Hands-on VeriFast with STM32 microcontroller
Hands-on VeriFast with STM32 microcontrollerHands-on VeriFast with STM32 microcontroller
Hands-on VeriFast with STM32 microcontroller
 
Metasepi team meeting #16: Safety on ATS language + MCU
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
 

Similar to Dive into Puppet 4

Nicolas Pastorino - The Open-source roar in the eZ Community
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
 
Code is so much more...
Code is so much more...Code is so much more...
Code is so much more...Praveen Puglia
 
Migrating to Puppet 5
Migrating to Puppet 5Migrating to Puppet 5
Migrating to Puppet 5Kris Buytaert
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to GitlabJulien Pivotto
 
Minou Minou ! Les chat(bot)s continuent leur invasion de l'INTERNET
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'INTERNETMaxime Pawlak
 
DrupalCamp Arad - Drupal 7 as a framework - an overview of available APIs
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 APIsValentin Bora
 
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!!!!!!!!!!!!
Dont bid on this question if you are not a python expert!!!!!!!!!!!!joney4
 
Python Versions and Dependencies Made Easy
Python Versions and Dependencies Made EasyPython Versions and Dependencies Made Easy
Python Versions and Dependencies Made EasySebastian Witowski
 
Testing your puppet code
Testing your puppet codeTesting your puppet code
Testing your puppet codeJulien Pivotto
 
Olmec guesstheartifactgameengagingpp twithpicturescluesanswers
Olmec guesstheartifactgameengagingpp twithpicturescluesanswersOlmec guesstheartifactgameengagingpp twithpicturescluesanswers
Olmec guesstheartifactgameengagingpp twithpicturescluesanswersprbroome
 
Spring, CDI, Jakarta EE good parts
Spring, CDI, Jakarta EE good partsSpring, CDI, Jakarta EE good parts
Spring, CDI, Jakarta EE good partsJarek Ratajski
 
Your Goat Anti-Fragiled My SnowFlake!
Your Goat Anti-Fragiled My SnowFlake!Your Goat Anti-Fragiled My SnowFlake!
Your Goat Anti-Fragiled My SnowFlake!Clinton Wolfe
 

Similar to Dive into Puppet 4 (20)

Python environments
Python environmentsPython environments
Python environments
 
Nicolas Pastorino - The Open-source roar in the eZ Community
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
 
Code is so much more...
Code is so much more...Code is so much more...
Code is so much more...
 
Devops -- LKFR14
Devops -- LKFR14Devops -- LKFR14
Devops -- LKFR14
 
Migrating to Puppet 5
Migrating to Puppet 5Migrating to Puppet 5
Migrating to Puppet 5
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to Gitlab
 
Minou Minou ! Les chat(bot)s continuent leur invasion de l'INTERNET
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
 
DrupalCamp Arad - Drupal 7 as a framework - an overview of available APIs
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
 
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!!!!!!!!!!!!
Dont bid on this question if you are not a python expert!!!!!!!!!!!!
 
Passivevoice
PassivevoicePassivevoice
Passivevoice
 
Passivevoice
PassivevoicePassivevoice
Passivevoice
 
Python Versions and Dependencies Made Easy
Python Versions and Dependencies Made EasyPython Versions and Dependencies Made Easy
Python Versions and Dependencies Made Easy
 
Testing your puppet code
Testing your puppet codeTesting your puppet code
Testing your puppet code
 
You, Mix and Kubee
You, Mix and KubeeYou, Mix and Kubee
You, Mix and Kubee
 
Olmec guesstheartifactgameengagingpp twithpicturescluesanswers
Olmec guesstheartifactgameengagingpp twithpicturescluesanswersOlmec guesstheartifactgameengagingpp twithpicturescluesanswers
Olmec guesstheartifactgameengagingpp twithpicturescluesanswers
 
Passive Voice.ppt
Passive Voice.pptPassive Voice.ppt
Passive Voice.ppt
 
图解Git
图解Git图解Git
图解Git
 
Spring, CDI, Jakarta EE good parts
Spring, CDI, Jakarta EE good partsSpring, CDI, Jakarta EE good parts
Spring, CDI, Jakarta EE good parts
 
Your Goat Anti-Fragiled My SnowFlake!
Your Goat Anti-Fragiled My SnowFlake!Your Goat Anti-Fragiled My SnowFlake!
Your Goat Anti-Fragiled My SnowFlake!
 
Pimp my Plone
Pimp my PlonePimp my Plone
Pimp my Plone
 

More from Julien Pivotto

What's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its EcosystemWhat's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its EcosystemJulien Pivotto
 
Prometheus: What is is, what is new, what is coming
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
 
What's new in Prometheus?
What's new in Prometheus?What's new in Prometheus?
What's new in Prometheus?Julien Pivotto
 
Introduction to Grafana Loki
Introduction to Grafana LokiIntroduction to Grafana Loki
Introduction to Grafana LokiJulien Pivotto
 
Why you should revisit mgmt
Why you should revisit mgmtWhy you should revisit mgmt
Why you should revisit mgmtJulien Pivotto
 
Observing the HashiCorp Ecosystem From Prometheus
Observing the HashiCorp Ecosystem From PrometheusObserving the HashiCorp Ecosystem From Prometheus
Observing the HashiCorp Ecosystem From PrometheusJulien Pivotto
 
Monitoring in a fast-changing world with Prometheus
Monitoring in a fast-changing world with PrometheusMonitoring in a fast-changing world with Prometheus
Monitoring in a fast-changing world with PrometheusJulien Pivotto
 
5 tips for Prometheus Service Discovery
5 tips for Prometheus Service Discovery5 tips for Prometheus Service Discovery
5 tips for Prometheus Service DiscoveryJulien Pivotto
 
Prometheus and TLS - an Introduction
Prometheus and TLS - an IntroductionPrometheus and TLS - an Introduction
Prometheus and TLS - an IntroductionJulien Pivotto
 
Powerful graphs in Grafana
Powerful graphs in GrafanaPowerful graphs in Grafana
Powerful graphs in GrafanaJulien Pivotto
 
HAProxy as Egress Controller
HAProxy as Egress ControllerHAProxy as Egress Controller
HAProxy as Egress ControllerJulien Pivotto
 
Improved alerting with Prometheus and Alertmanager
Improved alerting with Prometheus and AlertmanagerImproved alerting with Prometheus and Alertmanager
Improved alerting with Prometheus and AlertmanagerJulien Pivotto
 
SIngle Sign On with Keycloak
SIngle Sign On with KeycloakSIngle Sign On with Keycloak
SIngle Sign On with KeycloakJulien Pivotto
 
Monitoring as an entry point for collaboration
Monitoring as an entry point for collaborationMonitoring as an entry point for collaboration
Monitoring as an entry point for collaborationJulien Pivotto
 
Incident Resolution as Code
Incident Resolution as CodeIncident Resolution as Code
Incident Resolution as CodeJulien Pivotto
 
Monitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusJulien Pivotto
 
Monitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusJulien Pivotto
 
An introduction to Ansible
An introduction to AnsibleAn introduction to Ansible
An introduction to AnsibleJulien Pivotto
 

More from Julien Pivotto (20)

The O11y Toolkit
The O11y ToolkitThe O11y Toolkit
The O11y Toolkit
 
What's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its EcosystemWhat's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its Ecosystem
 
Prometheus: What is is, what is new, what is coming
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
 
What's new in Prometheus?
What's new in Prometheus?What's new in Prometheus?
What's new in Prometheus?
 
Introduction to Grafana Loki
Introduction to Grafana LokiIntroduction to Grafana Loki
Introduction to Grafana Loki
 
Why you should revisit mgmt
Why you should revisit mgmtWhy you should revisit mgmt
Why you should revisit mgmt
 
Observing the HashiCorp Ecosystem From Prometheus
Observing the HashiCorp Ecosystem From PrometheusObserving the HashiCorp Ecosystem From Prometheus
Observing the HashiCorp Ecosystem From Prometheus
 
Monitoring in a fast-changing world with Prometheus
Monitoring in a fast-changing world with PrometheusMonitoring in a fast-changing world with Prometheus
Monitoring in a fast-changing world with Prometheus
 
5 tips for Prometheus Service Discovery
5 tips for Prometheus Service Discovery5 tips for Prometheus Service Discovery
5 tips for Prometheus Service Discovery
 
Prometheus and TLS - an Introduction
Prometheus and TLS - an IntroductionPrometheus and TLS - an Introduction
Prometheus and TLS - an Introduction
 
Powerful graphs in Grafana
Powerful graphs in GrafanaPowerful graphs in Grafana
Powerful graphs in Grafana
 
YAML Magic
YAML MagicYAML Magic
YAML Magic
 
HAProxy as Egress Controller
HAProxy as Egress ControllerHAProxy as Egress Controller
HAProxy as Egress Controller
 
Improved alerting with Prometheus and Alertmanager
Improved alerting with Prometheus and AlertmanagerImproved alerting with Prometheus and Alertmanager
Improved alerting with Prometheus and Alertmanager
 
SIngle Sign On with Keycloak
SIngle Sign On with KeycloakSIngle Sign On with Keycloak
SIngle Sign On with Keycloak
 
Monitoring as an entry point for collaboration
Monitoring as an entry point for collaborationMonitoring as an entry point for collaboration
Monitoring as an entry point for collaboration
 
Incident Resolution as Code
Incident Resolution as CodeIncident Resolution as Code
Incident Resolution as Code
 
Monitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with Prometheus
 
Monitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with Prometheus
 
An introduction to Ansible
An introduction to AnsibleAn introduction to Ansible
An introduction to Ansible
 

Recently uploaded

The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 

Recently uploaded (20)

The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 

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