Ottawa Puppet User Group - Publishing a Module on the Puppet Forge

Preview:

DESCRIPTION

A presentation delivered at the February 2014 meeting of the Ottawa Puppet User Group, discussing why you would want to publish a module to the Puppet Forge, and some best practices for module development.

Citation preview

Publishing A Module On The Puppet Forge

An introduction to packaging your module and sharing it with the community

Bill Fraser

February 25, 2014

Agenda

• Introduction • Why you should publish your module • What is a module, anyway? • Managing configuration with style! • Continuous integration • Next steps • Q & A

2 © 2014 Pythian

Introduction

3 © 2014 Pythian

Why Publish A Module?

• Major strength of Puppet • Over 2000 modules • Integration via Puppet Module Tool • Metadata (version, release date, downloads) • Searchable • Documentation (requirements, parameters, usage) • Giving back to the community

4 © 2014 Pythian

Truth In Advertising

• Documentation exists • Adheres to best practice • Dependency resolution • Semantic versioning • Automated test and build

5 © 2014 Pythian

What Is A Module?

1. Identify Problem 2. Solve Problem 3. ??? 4. Profit!

6 © 2014 Pythian

What Is A Module? /etc/puppet/modules/widget/manifests/init.pp

7 © 2014 Pythian

What Is A Module?

• widget – Top-level matches the name of the module – manifests/ – All of the manifests for the module

• init.pp – Main class definition for the module • doodad.pp – Class named widget::doodad

– files/ – Location for static files – lib/ – Contains plugins, custom facts / resources – templates/ – Contains templates – tests/ – Examples of how to declare classes / types – spec/ – Contains spec tests

8 © 2014 Pythian

puppet module generate • Modulefile

– Module metadata – Dependency information

9 © 2014 Pythian

• README • spec_helper.rb

Managing Configuration With Style!

• “Just because you can, doesn’t mean you should” • By Conforming to the style guide, you ensure that

– You follow best practice in module design and style – Your module is readable and therefore easier to maintain – Your module will work with an ENC without requiring one – You do not inherit or declare other classes unless you need to

• puppet-lint is your friend!

10 © 2014 Pythian

puppet-lint

• Install puppet-lint

11 © 2014 Pythian

• Run puppet-lint

• But wait, let’s make it more awesome!

puppet-lint • Gemfile

12 © 2014 Pythian

• Rakefile

Continuous Integration

• Automatic testing against multiple Ruby and / or Puppet versions

• Travis CI and GitHub – Sign in through GitHub OAuth and grant read and

write access to GitHub – Activate GitHub service hooks – Add .travis.yml to your module repository – Validate your .travis.yml file with travis-lint – Trigger a build

13 © 2014 Pythian

Continuous Integration Add .travis.yml to your module repository

14 © 2014 Pythian

Continuous Integration

15 © 2014 Pythian

Next Steps

• Test Driven Development (TDD) • Behaviour Driven Development (BDD) • rspec-puppet • rspec-system

16 © 2014 Pythian

References • Puppet Forge: http://forge.puppetlabs.com/ • Style Guide: http://docs.puppetlabs.com/guides/style_guide.html • Publishing Modules on the Puppet Forge:

http://docs.puppetlabs.com/puppet/latest/reference/modules_publishing.html • puppet-lint: http://puppet-lint.com/ • Travis CI: https://travis-ci.org/ • Pro Puppet, Second Edition: http://www.apress.com/9781430260400 • GDash Module

– Puppet Forge: http://forge.puppetlabs.com/bfraser/gdash – GitHub: https://github.com/bfraser/puppet-gdash

17 © 2014 Pythian

Questions?

Thank you!

Bill Fraser fraser@pythian.com

18 © 2014 Pythian

Recommended