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
 
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
 
Tackling Python: What is it and how can it help with Technical SEO?
Tackling Python: What is it and how can it help with Technical SEO?Tackling Python: What is it and how can it help with Technical SEO?
Tackling Python: What is it and how can it help with Technical SEO?BristolSEO
 
The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...
The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...
The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...Ruth Everett
 
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
 
Pinto+Stratopan+Love
Pinto+Stratopan+LovePinto+Stratopan+Love
Pinto+Stratopan+Love
 
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
 
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
 
Tackling Python: What is it and how can it help with Technical SEO?
Tackling Python: What is it and how can it help with Technical SEO?Tackling Python: What is it and how can it help with Technical SEO?
Tackling Python: What is it and how can it help with Technical SEO?
 
The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...
The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...
The Power of Python :: How It Can Help With Technical SEO | Bristol SEO May 2...
 
Your Goat Anti-Fragiled My SnowFlake!
Your Goat Anti-Fragiled My SnowFlake!Your Goat Anti-Fragiled My SnowFlake!
Your Goat Anti-Fragiled My SnowFlake!
 

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

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024The Digital Insurer
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 

Recently uploaded (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 

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