82
Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development Diving Into Providers Development The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module The Puppet-Corosync Module Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto Julien Pivotto PuppetCamp Paris, June 7th, 2016

Diving Into Puppet Providers Development: The Puppet-Corosync Module

Embed Size (px)

Citation preview

Page 1: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 2: Diving Into Puppet Providers Development: The Puppet-Corosync Module

$::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

Page 3: Diving Into Puppet Providers Development: The Puppet-Corosync Module

inuits.eu

Page 4: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 5: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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,}

Page 6: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 7: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

package {'nginx':

ensure => present,}

Page 8: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

package {'nginx':

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

}

Page 9: Diving Into Puppet Providers Development: The Puppet-Corosync Module

ClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsClusterlabsLicensed under a Creative Commons Attribution 2.0 License

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

Page 10: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 11: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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 ……………………………………………

Page 12: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 13: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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?• ……………………………………………

Page 14: Diving Into Puppet Providers Development: The Puppet-Corosync Module

http://puppetlabs.com

Page 15: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 16: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 17: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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'],

}

Page 18: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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()

Page 19: Diving Into Puppet Providers Development: The Puppet-Corosync Module
Page 20: Diving Into Puppet Providers Development: The Puppet-Corosync Module
Page 21: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 22: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 23: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 24: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 25: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 26: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 27: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 28: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 29: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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, …

Page 30: Diving Into Puppet Providers Development: The Puppet-Corosync Module

TypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypesTypes

Page 31: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 32: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 33: Diving Into Puppet Providers Development: The Puppet-Corosync Module

namevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevarnamevar

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

isnamevarend

Page 34: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 35: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 36: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 37: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 38: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 39: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 40: Diving Into Puppet Providers Development: The Puppet-Corosync Module

mungemungemungemungemungemungemungemungemungemungemungemungemungemungemungemungemunge

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

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

include?(':')value

endend

Page 41: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 42: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 43: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 44: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 45: Diving Into Puppet Providers Development: The Puppet-Corosync Module

booleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanbooleanboolean

require 'puppet/parameter/boolean'

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

Page 46: Diving Into Puppet Providers Development: The Puppet-Corosync Module

autorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequiresautorequires

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

@parameters[:cib]autos

end

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

end

Page 47: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 48: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 49: Diving Into Puppet Providers Development: The Puppet-Corosync Module

ProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProvidersProviders

Page 50: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 51: Diving Into Puppet Providers Development: The Puppet-Corosync Module

ProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProviderProvider

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

command'end

Page 52: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 53: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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)

Page 54: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 55: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

package {'nginx':

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

}

Page 56: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 57: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 58: Diving Into Puppet Providers Development: The Puppet-Corosync Module

prefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetchingprefetching

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

}

Page 59: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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)

Page 60: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 61: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 62: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 63: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 64: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 65: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 66: Diving Into Puppet Providers Development: The Puppet-Corosync Module

TestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingTestingLicensed under a Creative Commons Attribution 2.0 License

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

Page 67: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 68: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 69: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 70: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 71: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 72: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 73: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 74: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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?

Page 75: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 76: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 77: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 78: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 79: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 80: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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, …

Page 81: Diving Into Puppet Providers Development: The Puppet-Corosync Module

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

Page 82: Diving Into Puppet Providers Development: The Puppet-Corosync Module

ContactContactContactContactContactContactContactContactContactContactContactContactContactContactContactContactContact

Julien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien PivottoJulien [email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@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

[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]+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