Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Using Ruby & Thor For Easier Puppet Module Deve...

Using Ruby & Thor For Easier Puppet Module Development

Using Ruby & Thor For Easier Puppet Module Development
Original slides: http://goo.gl/syiOUW

Avatar for Tehmasp Chaudhri

Tehmasp Chaudhri

December 09, 2013
Tweet

Other Decks in Technology

Transcript

  1. USING RUBY & THOR FOR EASIER PUPPET MODULE DEVELOPMENT /

    (We're Hiring!) Tehmasp Chaudhri @tehmaspc Pearson North America
  2. WHAT IS THOR? Thor is a Ruby toolkit for building

    powerful command-line interfaces. The developer can easily integrate Thor into their Ruby code. Classes such as Groups, Actions, and Shell are provided which make tasks such as file system interaction and command line user dialogue easier. Thor can be leveraged to make custom project generators (e.g. 'bundle gem -b mygem')
  3. WHY DID WE USE THOR? Technical Reasons: Thor is written

    in Ruby, our Puppet code is in a Ruby DSL. Thor's custom project generator use case was appealing and works well. It's easy to add and update template files. We wanted to create a framework for Puppet module development which provided the Puppet tools we like, so that we could create standalone & well tested Puppet modules. Thor let us glue all this together. Business Reasons: We allow (many) dev teams to contribute to our Puppet module development; thus we needed a way to make creating Puppet modules quick & easy, consistent, manageable, and with 'best practices' baked in.
  4. TOOLS WE LIKE TO USE WITH PUPPET MODULE DEVELOPMENT: puppet-lint

    puppet-git-hooks puppetlabs_spec_helper rspec-puppet serverspec vagrant bundler rake jenkins Shoutout to Phil Zimmerman's Puppet Testing For The Win
  5. THOR CUSTOM GENERATOR EXAMPLE: . . . d e f

    w r i t e _ e m p t y d i r s e m p t y _ d i r e c t o r y t a r g e t . j o i n ( ' f i l e s ' ) e m p t y _ d i r e c t o r y t a r g e t . j o i n ( ' m a n i f e s t s ' ) e m p t y _ d i r e c t o r y t a r g e t . j o i n ( ' t e m p l a t e s ' ) e m p t y _ d i r e c t o r y t a r g e t . j o i n ( ' s p e c ' ) e m p t y _ d i r e c t o r y t a r g e t . j o i n ( ' s e r v e r s p e c / s p e c ' ) e m p t y _ d i r e c t o r y t a r g e t . j o i n ( ' . v a g r a n t _ p u p p e t ' ) e n d d e f w r i t e _ r e a d m e t e m p l a t e ' R E A D M E . m d . e r b ' , t a r g e t . j o i n ( ' R E A D M E . m d ' ) e n d d e f w r i t e _ m o d u l e f i l e t e m p l a t e ' p u p p e t / M o d u l e F i l e . e r b ' , t a r g e t . j o i n ( ' M o d u l e F i l e ' ) e n d . . .
  6. MODULEFILE.ERB EXAMPLE: n a m e ' < % =

    m o d u l e _ n a m e % > ' v e r s i o n ' 0 . 1 . 0 ' s o u r c e ' U N K N O W N ' a u t h o r ' < % = m a i n t a i n e r _ e m a i l % > ' l i c e n s e ' < % = l i c e n s e _ n a m e % > ' s u m m a r y ' U N K N O W N ' d e s c r i p t i o n ' U N K N O W N ' p r o j e c t _ p a g e ' U N K N O W N ' # # A d d d e p e n d e n c i e s , i f a n y : # d e p e n d e n c y ' u s e r n a m e / n a m e ' , ' > = 1 . 2 . 0 '
  7. CURRENT LIST OF TEMPLATE FILES: . / g i t

    / g i t i g n o r e . e r b . / g i t / p u p p e t - g i t - h o o k s - p r e - c o m m i t . e r b . / l i c e n s e s / a p a c h e v 2 . e r b . / l i c e n s e s / m i t . e r b . / l i c e n s e s / r e s e r v e d . e r b . / p u p p e t / i n i t . p p . e r b . / p u p p e t / M o d u l e F i l e . e r b . / R E A D M E . m d . e r b . / s p e c / f i x t u r e s . y m l . e r b . / s p e c / r s p e c / i n i t _ s p e c . r b . e r b . / s p e c / r s p e c / s p e c _ h e l p e r . r b . e r b . / s p e c / s e r v e r s p e c / i n i t _ s p e c . r b . e r b . / s p e c / s e r v e r s p e c / s p e c _ h e l p e r . r b . e r b . / u t i l / G e m f i l e . e r b . / u t i l / R a k e f i l e . e r b . / v a g r a n t / i n i t . p p . e r b . / v a g r a n t / V a g r a n t f i l e . e r b