class: center, middle, inverse # What Open Source can
do for your business ??? --- class: center, middle, inversedoubleheading # What Open Source can
do for your business ## Or why you should publish your Puppet modules ??? --- ## $ whoami
* Tim 'bastelfreak' Meusel * Puppet Contributor since 2012 * Merging stuff on [Vox Pupuli](https://voxpupuli.org/) (Puppet Community) since 2015 * Vox Pupuli Project Management Committee member * Senior IT Automation Consultant at [betadots](https://betadots.de/)
??? * who has seen this picture before because I reviewed/merged your pull request? --- class: center, middle, inverse # What's this
Vox Pupuli thingy? ??? --- .left-column[ ## Vox Pupuli ### What? ] .right-column[ * Maintain many many Puppet modules ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * 150 Puppet modules in 2021. 175 *active* modules at the moment * 43 Ruby Gems in 2021, 54 *active* gems at the moment --- count: false .left-column[ ## Vox Pupuli ### What? ] .right-column[ * Maintain many many Puppet modules * And Rubygems! ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * 150 Puppet modules in 2021. 175 *active* modules at the moment * 43 Ruby Gems in 2021, 54 *active* gems at the moment --- count: false .left-column[ ## Vox Pupuli ### What? ] .right-column[ * Maintain many many Puppet modules * And Rubygems! * Be helpful and polite to each other ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * We've a code of conduct at least since 2016 and had a single violation * A person wasn't polite to a few others --- count: false .left-column[ ## Vox Pupuli ### What? ] .right-column[ * Maintain many many Puppet modules * And Rubygems! * Be helpful and polite to each other * Be open-minded to people and technology ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- count: false .left-column[ ## Vox Pupuli ### What? ] .right-column[ * Maintain many many Puppet modules * And Rubygems! * Be helpful and polite to each other * Be open-minded to people and technology * Provide a home for orphaned Puppet modules ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- count: false .left-column[ ## Vox Pupuli ### What? ] .right-column[ * Maintain many many Puppet modules * And Rubygems! * Be helpful and polite to each other * Be open-minded to people and technology * Provide a home for orphaned Puppet modules * Unite lonely module and tooling authors to a collective ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Vox Pupuli ### What? ] .right-column[ * Maintain many many Puppet modules * And Rubygems! * Be helpful and polite to each other * Be open-minded to people and technology * Provide a home for orphaned Puppet modules * Unite lonely module and tooling authors to a collective * Ensure continued development for our code ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Vox Pupuli ### Who? ] .right-column[ * Amount of Vox Pupuli members with merge permissions ![img](contributors.svg) ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * 2021: 161 members in the GitHub org with merge access * now: 186 --- .left-column[ ## Vox Pupuli ### Who? ] .right-column[ * Many git newbies * Rebasing a feature branch against upstream master is hard ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- count: false .left-column[ ## Vox Pupuli ### Who? ] .right-column[ * Many git newbies * Rebasing a feature branch against upstream master is hard * Many newcomers to test frameworks * Interested in learing RuboCop/puppet-lint/rspec-puppet/serverspec ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * Those are the tools we use in our CI * talk about them later * CI runs automatically * CI does code annotations * People want to fix/enhance their code because CI feedback is quick and nice --- count: false .left-column[ ## Vox Pupuli ### Who? ] .right-column[ * Many git newbies * Rebasing a feature branch against upstream master is hard * Many newcomers to test frameworks * Interested in learing RuboCop/puppet-lint/rspec-puppet/serverspec * DevOps/Platform Engineers in a small/tiny team * Use Puppet at work and want to use public modules ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * a team so tiny, often a single person --- count: false .left-column[ ## Vox Pupuli ### Who? ] .right-column[ * Many git newbies * Rebasing a feature branch against upstream master is hard * Many newcomers to test frameworks * Interested in learing RuboCop/puppet-lint/rspec-puppet/serverspec * DevOps/Platform Engineers in a small/tiny team * Use Puppet at work and want to use public modules * Consultants that contribute to one/a few modules for a period of time ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * We provide letter of recognitions or kinda an employment reference --- class: center, middle, inverse # How to design
a good Puppet module? ??? * who wrote open source software that's public on the internet? * Who wrote a puppet module (no matter public/private)? * Who published it to forge.puppet.com? * Anybody not using Puppet? --- .left-column[ ## Module Design ### Status Quo ] .right-column[ * You write your own component Puppet modules * A module that manages a single component (Apache *or* nginx) ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * a component module manages a component of the infrastructure * a specific software * like nginx or mysql --- count: false .left-column[ ## Module Design ### Status Quo ] .right-column[ * You write your own component Puppet modules * A module that manages a single component (Apache *or* nginx) * You also want to reuse Open Source component modules from others * Because there are already awesome modules for nginx ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * reinventing the wheel is bad * using an existing module saves times * saving time saves money * VPs like saving money --- count: false .left-column[ ## Module Design ### Status Quo ] .right-column[ * You write your own component Puppet modules * A module that manages a single component (Apache *or* nginx) * You also want to reuse Open Source component modules from others * Because there are already awesome modules for nginx * Many of your servers are very similar, but not identical ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * all servers use your internal DNS resolver in /etc/resolv.conf * except for the DNS server itself, which forwards to cloudflare --- count: false .left-column[ ## Module Design ### Status Quo ] .right-column[ * You write your own component Puppet modules * A module that manages a single component (Apache *or* nginx) * You also want to reuse Open Source component modules from others * Because there are already awesome modules for nginx * Many of your servers are very similar, but not identical * Design requirement 1: Use internal and external component modules in parallel * Design requirement 2: Assign those component modules to groups of servers ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Module Design ### Status Quo ### Roles & Profiles ] .right-column[ .nowidth[![imagefoo](rapwoh.svg)] ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * Who knows this pattern? * Who uses it? --- .left-column[ ## Module Design ### Status Quo ### Roles & Profiles ### Data vs Code ] .right-column[ * People that write Puppet Code might not provide the data ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Module Design ### Status Quo ### Roles & Profiles ### Data vs Code ] .right-column[ * People that write Puppet Code might not provide the data * DevOps people want to use an external component module * platform engineers write Puppet code * network engineers provide ip addresses and firewall rules * Product owner provides version numbers for deployments ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Module Design ### Status Quo ### Roles & Profiles ### Data vs Code ] .right-column[ * People that write Puppet Code might not provide the data * DevOps people want to use an external component module * platform engineers write Puppet code * network engineers provide ip addresses and firewall rules * Product owner provides version numbers for deployments * Secrets should come from a secret store like Hashicorp Vault or hiera-eyaml ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Module Design ### Status Quo ### Roles & Profiles ### Data vs Code ] .right-column[ * People that write Puppet Code might not provide the data * DevOps people want to use an external component module * platform engineers write Puppet code * network engineers provide ip addresses and firewall rules * Product owner provides version numbers for deployments * Secrets should come from a secret store like Hashicorp Vault or hiera-eyaml * Design requirement 3: Separate data and code ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Module Design ### Status Quo ### Roles & Profiles ### Data vs Code ] .right-column[ .nowidth[![imagefoo](rap.svg)] ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * who knows hiera-eyaml --- .left-column[ ## Module Design ### Status Quo ### Roles & Profiles ### Data vs Code ] .right-column[ * It's hard for enforce code design/architecture with CI jobs * You might leak private information if you publish an existing internal module ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Why Open Sourcing? ### Technical aspects ] .right-column[ * Publish a module from the beginning * This enforces a proper structure in your code ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Why Open Sourcing? ### Technical aspects ] .right-column[ * Publish a module from the beginning * This enforces a proper structure in your code * This ensures secrets are never added to it ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Why Open Sourcing? ### Technical aspects ] .right-column[ * Publish a module from the beginning * This enforces a proper structure in your code * This ensures secrets are never added to it * Many companies still don't have internal CI * There are free CI services for open source software! ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Why Open Sourcing? ### Technical aspects ] .right-column[ * Publish a module from the beginning * This enforces a proper structure in your code * This ensures secrets are never added to it * Many companies still don't have internal CI * There are free CI services for open source software! * Aim to create a successfull open source project ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * What do dou think is a successful open source project? --- .left-column[ ## Why Open Sourcing? ### Technical aspects ] .right-column[ * Publish a module from the beginning * This enforces a proper structure in your code * This ensures secrets are never added to it * Many companies still don't have internal CI * There are free CI services for open source software! * Aim to create a successfull open source project * Success is often measured by the amount of users ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * You can track github stars or downloads, as a rough metric * this is far away from perfect, but it's something * print that in your office to the wall * or review it during your scrum retro meetings * remember the vox pupuli user counter earlier * of course I love the growth * I love that ansible community reached out to us and wanted to know who we do this --- .left-column[ ## Why Open Sourcing? ### Technical aspects ] .right-column[ * Publish a module from the beginning * This enforces a proper structure in your code * This ensures secrets are never added to it * Many companies still don't have internal CI * There are free CI services for open source software! * Aim to create a successfull open source project * Success is often measured by the amount of users * New users require documentation ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * convince the team to aim for a successful project * will increase the confidence within the team, the code quality and the documentation * makes it easier to onboard new hires/employees --- .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ] .right-column[ Vox Pupuli sales pitch: * Vox Pupuli has proper tooling to handle many modules ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * Who saw the talk from Ewoud yesterday? * awesome talk about all the technical aspects and benefits Vox Pupuli has * He didn't mention he had the ideas for most of the stuff and built a big part of it --- .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ] .right-column[ Vox Pupuli sales pitch: * Vox Pupuli has proper tooling to handle many modules * Vox Pupuli maintains community guidelines and best practices * https://voxpupuli.org/docs/reviewing_pr/ ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ] .right-column[ Vox Pupuli sales pitch: * Vox Pupuli has proper tooling to handle many modules * Vox Pupuli maintains community guidelines and best practices * https://voxpupuli.org/docs/reviewing_pr/ * Working in a collective enforces proper documentation and git commits ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * It's important to document code (changes) properly * new hires need to understand it * this gets tricky if documentation is reviewed by a small group of people that work with you on a daily basis * people that don't contribute to open source often have issue explaining code changes properly in git commits --- .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ] .right-column[ * Our CI Setup * Validate code -> Lint Code -> Generate CI Matrix ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * We validate the code to check for syntax errors * All metadata.json, custom Ruby, Puppet files * RuboCop/Puppet-lint to ensure a best practice code style * generate CI matrix --- count: false .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ] .right-column[ * Our CI Setup * Validate code -> Lint Code -> Generate CI Matrix * `jq .requirements[0] metadata.json` ```json { "name": "puppet", "version_requirement": ">= 6.1.0 < 8.0.0" } ``` ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * Identify major supported puppet version, 6 and 7 here * Generate unit test matrix with rspec-puppet --- count: false .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ] .right-column[ * Our CI Setup * Validate code -> Lint Code -> Generate CI Matrix * `jq .requirements[0] metadata.json` ```json { "name": "puppet", "version_requirement": ">= 6.1.0 < 8.0.0" } ``` * `jq .operatingsystem_support[0] metadata.json` ```json { "operatingsystem": "RedHat", "operatingsystemrelease": [ "6", "7" ] } ``` ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * generate a beaker job for each OS/Puppet version * mock facts for each OS in rspec-puppet --- .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ] .right-column[ * Our CI Setup Documentation * CI Matrix generation:
github.com/voxpupuli/puppet_metadata
* unit testing with rspec-puppet:
github.com/voxpupuli/voxpupuli-test
* acceptance testing with beaker:
github.com/voxpupuli/voxpupuli-acceptance
* Shard GitHub Action:
github.com/voxpupuli/gha-puppet
]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ### Company advantages ] .right-column[ * Companies that do open source work are recognized in the community * Attract new hires through open source work * That's how I got to betadots! ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ### Company advantages ] .right-column[ * Companies that do open source work are recognized in the community * Attract new hires through open source work * That's how I got to betadots! * Benefit from the knowledge and contributions within the community ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- .left-column[ ## Why Open Sourcing? ### Technical aspects ### Vox Pupuli ### Company advantages ] .right-column[ * Companies that do open source work are recognized in the community * Attract new hires through open source work * That's how I got to betadots! * Benefit from the knowledge and contributions within the community * Benefit from the tooling within the community ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- class: center, middle, inverse # The
Conclusion ??? --- .left-column[ ## Conclusion ] .right-column[ * You should publish your internal puppet modules * Vox Pupuli is awesome, please contribute! * We've great tooling to scale module handling ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? * Need help with opensourcing your puppet modules or rubygems or CI setup? Let us know --- .left-column[ ## Conclusion ] .right-column[ * You should publish your internal puppet modules * Vox Pupuli is awesome, please contribute! * We've great tooling to scale module handling * For feedback: `bastelfreak` on
slack.puppet.com
/Libera.Chat IRC or [tim@bastelfreak.de](mailto:tim@bastelfreak.de) * This talk and previous ones:
github.com/bastelfreak/talks
### Thanks for your attention! ]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)] ??? --- count: false .left-column[ ## Vox Pupuli ] .right-column[
]
.footnote[[@bastelsblog](https://twitter.com/bastelsblog) for [@voxpupuliorg](https://twitter.com/voxpupuliorg)]