Diving Into Puppet Providers Development: The Puppet-Corosync Module

Preview:

Citation preview

Diving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers DevelopmentDiving Into Providers Development

The Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync ModuleThe Puppet-Corosync Module

Julien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien Pivotto

PuppetCamp Paris, June 7th, 2016

$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::user$::userJulien 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 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)Puppet user since 2011 (0.24 -> 4.5)• Member of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuliMember of the Belgian PUG & voxpupuli• Puppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributorPuppet core & modules contributor• The Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & contributorThe Foreman user & 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

Puppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersPuppet Types & ProvidersLicensed under a Creative Commons Attribution 2.0 License

https://www.flickr.com/photos/mseckington/3445427966

Puppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarativePuppet DSL is declarative

package {'nginx':

ensure => present,}

AbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstractionAbstraction

• Puppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSL• …describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources…describes resources• …defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types…defined by types• …implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers…implemented by providers

Puppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSL

package {'nginx':

ensure => present,}

Puppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSLPuppet DSL

package {'nginx':

ensure => present,provider => 'gem',

}

ClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsLicensed under a Creative Commons Attribution 2.0 License

https://www.flickr.com/photos/blondinrikard/8455288325

Clusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suiteClusterlabs suite

• High-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability toolsHigh-Availability tools• Manage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availabilityManage services, ensure availability• Decides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services runDecides where services run• Manages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP'sManages Virtual IP's

Clusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs componentsClusterlabs components

• Resource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesResource Agents: manipulate servicesI Start, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopStart, StopI MonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorMonitorI Promote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, DemotePromote, Demote

• Corosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communicationCorosync: cross-nodes communication• Pacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisionsPacemaker: Coordinator, taking decisions

I Who runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsWho runsI WhereWhereWhereWhereWhereWhereWhereWhereWhereWhereWhereWhereWhereWhereWhereWhereWhereI Who is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterWho is masterI ……………………………………………

http://clusterlabs.org/img/Deploy.20121116.png

Inside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a clusterInside a cluster

• Primitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, ServicePrimitives: Floating IP, Service• Location Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they runLocation Rules: Where should they run• Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?Colocation Rules: Who runs with who?• Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?Order rules: Who runs before who?• ……………………………………………

http://puppetlabs.com

Puppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a clusterPuppetizing a cluster

• Ensures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config syncEnsures managed services config sync• Ensures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistentEnsures cluster configuration is consistent• Increase confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updatesIncrease confidence in updates• Multiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prodMultiple environemnts: dev, uat, prod

The old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old way

• Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011Around 2011• Put the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a filePut the whole config in a file• Reload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changesReload config when file changes

The old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old wayThe old way

file { '/etc/cluster/cib.cfg':ensure => 'file',content => template('ms−cluster/cib−drbd.cfg.erb'),group => '0',mode => '0644',owner => '0',

}

exec { 'loadcrmconfig':refreshonly => true,command => '/usr/sbin/crm configure load replace /

etc/cluster/cib.cfg',subscribe => File['/etc/cluster/cib.cfg'],

}

Execs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are badExecs are bad

• refreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failurerefreshonly + failure• complex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyifcomplex onlyif• command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()command => template()

Puppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-Corosync

• A "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" moduleA "Puppetlabs" module• Managing the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster servicesManaging the cluster services

I CorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncCorosyncI PacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerPacemakerI CMANCMANCMANCMANCMANCMANCMANCMANCMANCMANCMANCMANCMANCMANCMANCMANCMANI pcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsdpcsd

• Good but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interestGood but lack of updates & interest• Define good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providersDefine good types and providers

Puppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-CorosyncPuppetlabs-Corosync

• Uses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the backUses "crm" in the back• crm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIBcrm is a CLI tool to manage the CIB• It was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distrosIt was used by all the distros

Puppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync typesPuppetlabs-Corosync types

• cs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitivecs_primitive• cs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_groupcs_group• cs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_locationcs_location• cs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocationcs_colocation• cs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clonecs_clone

The Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs SchismThe Clusterlabs Schism

• 2013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.42013: RHEL/CentOS 6.4• Removes support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crmRemoves support for crm• Implements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcsImplements its own replacement: pcs• crm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymorecrm is not available anymore• pcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggypcs is young and buggy

2013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-20152013-2015

• Puppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowlyPuppetlabs-Corosync evolves slowly• Joshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcsJoshua Hoblitt strarts implementing pcs• I continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementationI continue the implementation• Puppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LTPuppet Contributor Summit LT• Please git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to communityPlease git back the module to community

2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards2015 & onwards

• Puppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to VoxpupuliPuppetlabs-corosync is moved to Voxpupuli• Now it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active moduleNow it is an active module• With unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance testsWith unit and acceptance tests• Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2Semantic versioning: current version 1.0.2• Pull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixedPull Requests and Issues reviewed/fixed

Types and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and Providers

Types and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and ProvidersTypes and Providers

• Built-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersBuilt-in types and providersI User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…User -> ldap, aix, pw, useradd…I Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …Service -> freebsd, windows, systemd, …I Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …Package -> yum, msi, pacman, …I Stable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet versionStable, proved, evolve with Puppet version

• Custom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersCustom types and providersI Distributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesDistributed in modulesI Concat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatConcat -> concatI Acl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixAcl -> posixI Cs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crmCs_primitive -> pcs, crm

PluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsyncPluginsync

• lib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of moduleslib directory of modules• lib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/providerlib/puppet/provider• lib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/typelib/puppet/type• can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …can also sync: augeas, facts, …

TypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypes

Puppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet typePuppet type

• A Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource TypeA Resource Type• Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)Describes what you want (not HOW)• Has parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and propertiesHas parameters and properties• Parameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for PuppetizationParameter: only for Puppetization• Property: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can checkProperty: Something you can check

cs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rbcs_primitive.rb

Puppet::Type.newtype(:cs_primitive) do@doc = "Type for manipulating

Corosync/Pacemaker primitives."

ensurableend

namevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevar

newparam(:name) dodesc "Name identifier of primitive."

isnamevarend

Simple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameterSimple parameter

newparam(:cib) dodesc "Name of the shadow CIB this

primitive should be created in."end

Simple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple PropertySimple Property

newproperty(:parameters) dodesc "Hash of params for the primitive."

end

Pre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined valuesPre-defined values

newproperty(:kind) dodesc "Designates the kindness of the

rule"

newvalues(:Optional , :Mandatory)

defaultto :Optionalend

newvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvaluesnewvalues

• List of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted valuesList of accepted values• Any other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an errorAny other value will throw an error• Accept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept RegexesAccept Regexes• Implies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checksImplies validation checks

ValidationValidationValidationValidationValidationValidationValidationValidationValidationValidationValidationValidationValidationValidationValidationValidationValidation

newproperty(:parameters) dodesc "Hash of params for the primitive."

validate do |value|raise Puppet::Error , 'Must be a hash.'

unless value.is_a? Hashend

defaultto Hash.newend

validatevalidatevalidatevalidatevalidatevalidatevalidatevalidatevalidatevalidatevalidatevalidatevalidatevalidatevalidatevalidatevalidate

• Function inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/propertyFunction inside a parameter/property• Cheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecationsCheks that value matches expecations• Never trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user inputNever trust user input• Type checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checkingType checking

mungemungemungemungemungemungemungemungemungemungemungemungemungemungemungemungemunge

newproperty(:first) dodesc "First Corosync primitive."

munge do |value|value = "#{value}:start" unless value.

include?(':')value

endend

mungemungemungemungemungemungemungemungemungemungemungemungemungemungemungemungemunge

• Transform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user inputTransform user input• NormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalizeNormalize• Can be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibilityCan be use for backwards compatibility

insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?

newproperty(:epoch) dodef insync?(is)

return true if ! @resource.replace?

superend

end

insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?insync?

• Checks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in syncChecks if a property is in sync• If it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual contentIf it matches the actual content

Cosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functionsCosmetic functions

• change_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_schange_to_s• String used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon changeString used for the report upon change

booleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanboolean

require 'puppet/parameter/boolean'

newparam(:force , :boolean => true, :parent=> Puppet::Parameter::Boolean)

autorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequires

autorequire(:cs_shadow) doautos = []autos << @parameters[:cib].value if

@parameters[:cib]autos

end

autorequire(:service) do%w(corosync pacemaker)

end

generate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resourcesgenerate resources

def generatereturn [] if self[:autocommit] != trueoptions = { name: @title }[Puppet::Type.type(:cs_commit).new(

options)]end

TypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypes

• Types describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe itemsTypes describe items• They are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users useThey are the API users use• They should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be completeThey should be complete• No interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with systemNo interaction with system

ProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProviders

ProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProviders

• Get the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resourcesGet the state of the resources• Change the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired stateChange the resources to the desired state

ProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProvider

Puppet::Type.type(:cs_primitive).provide(:pcs) dodesc 'Manage cs_primitives with the pcs

command'end

How providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers workHow providers work

• Fetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressourceFetch information per ressource• Fetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at onceFetch all the resources at once• One type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providersOne type often have multiple providers

Pick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right providerPick the right provider

• Using installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commandsUsing installed commands• Using factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing factsUsing facts• Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)Explicitely (provider metaparameter)

Provider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choiceProvider choice

commands :cmd => "yum", :rpm => "rpm"

if command('rpm')confine :true => begin

rpm('−−version')rescue Puppet::ExecutionFailure

falseelse

trueend

end

defaultfor :osfamily => :redhat

Explicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit providerExplicit provider

package {'nginx':

ensure => present,provider => 'gem',

}

PrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetchPrefetch

• Fetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources firstFetch all resources first• Then create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is neededThen create/change what is needed• Very efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficientVery efficient

prefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingdef self.instances

instances = []

cmd = [command(:pcs), 'cluster', 'cib']raw, = run_command_in_cib(cmd)doc = REXML::Document.new(raw)

REXML::XPath.each(doc, '//primitive') do|e|

instances << new(element_to_hash(e))end

instancesend

prefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetching

resources { 'cs_primitive':purge => true,noop => true,

}

Applying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying changeApplying change

• Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)Per property (def mode=, def content=)• Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)Once for all (def flush)

set per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per propertyset per property

def mode=(value)File.chmod(value.to_i(8), resource[:

path])end

flushflushflushflushflushflushflushflushflushflushflushflushflushflushflushflushflush

mk_resource_methods

def flushunless @property_hash.empty?

cmd = [command(:pcs), 'property', 'set', "#{@property_hash[:name]}=#{@property_hash[:value]}"]

run_command_in_cib(cmd)end

end

FeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeaturesFeatures

• Not all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equalNot all providers are equal• systemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask servicessystemd can Mask services• sysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can notsysvinit can not

In the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the providerIn the provider

has_feature :kindness

Check for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a featureCheck for a feature

def flushunless @property_hash.empty?

updated << " kind=#{@property_hash[:kind]}" if feature? :kindness

endend

Restrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in typeRestrict parameters in type

newproperty(:kind, required_features: :kindness) dodesc "How to enforce the constraint."

end

TestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingLicensed under a Creative Commons Attribution 2.0 License

https://www.flickr.com/photos/dahlstroms/3945656390

Testing typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting typesTesting types

• Unit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit tests• Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …Test validation, munging, change_to_s, …• Test presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentationTest presence of documentation

Testing providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providers

• Unit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit testsUnit tests• Test resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methodsTest resource methods• Mock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to runMock commands to run• Mock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to BMock a transform from A to B

Testing providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providersTesting providers

• Acceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance testsAcceptance tests• BeakerBeakerBeakerBeakerBeakerBeakerBeakerBeakerBeakerBeakerBeakerBeakerBeakerBeakerBeakerBeakerBeaker• Test that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources appliesTest that resources applies• Test the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired stateTest the desired state• Test for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotencyTest for indempotency• Run on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containersRun on actual OS or containers

Puppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modulesPuppetlabs modules

• Beaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travisBeaker tests implemented on travis• Only for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OSOnly for a few OS• Uses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses DockerUses Docker• e.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apachee.g puppetlabs-apache

Voxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modulesVoxpupuli modules

• Beaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisorBeaker tests implemented on hypervisor• Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7Ubuntu 14.04/CentOS 7• Virtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual MachineVirtual Machine

Docker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs HypervisorsDocker vs Hypervisors

• Docker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-OnlyDocker is Linux-Only• Not an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating systemNot an full Operating system• Docker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosyncDocker is not an option to test corosync

How we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve testsHow we could improve tests

• Write more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situationsWrite more tests, more situations• Populate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM'sPopulate several VM's• Increase range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OSIncrease range of OS

What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?What is difficult?

IdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotenceIdempotence

• Make it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first timeMake it work the first time• Match exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the realityMatch exactly the reality• From any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situationFrom any situation to any situation

Defining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining typesDefining types

• Parameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obviousParameters/Properties should be obvious• They should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specificThey should not be provider specific• Your types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API'sYour types are your API's

DocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentationDocumentation

• Little documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentationLittle documentation• Blog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog postsBlog posts• A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)A book (2012)• Puppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebasePuppet codebase

SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94SERVER-94

• Ruby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per envRuby code in lib/ is not isolated per env• Workaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmastersWorkaround: use multiple puppetmasters• Puppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possiblePuppetserver (clojure) makes it possible

Other examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examplesOther examples

Types/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examplesTypes/Providers examples

• dobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and providerdobbymoodge-acl: type and provider• augeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providersaugeasproviders: types and providers• jenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and providerjenkinsci-jenkins: types and provider• jenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package providerjenkinsci-jenkins: package provider• zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …zabbix, aws, …

Types and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providersTypes and providers

• Express everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everythingExpress everything• Integrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with PuppetIntegrate with Puppet• The power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providersThe power is hidden in providers• Enable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet codersEnable KISS for Puppet coders

ContactContactContactContactContactContactContactContactContactContactContactContactContactContactContactContactContact

Julien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien Pivottojulien@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

inuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitsinuitshttps://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

Recommended