steamlining your puppet development workflow

36
Streamlining your puppet development workflow Tomas Doran @bobtfish 20140707

Upload: tomas-doran

Post on 27-Aug-2014

2.024 views

Category:

Software


3 download

DESCRIPTION

My talk from PuppetCamp NY 2014. About

TRANSCRIPT

Page 1: Steamlining your puppet development workflow

Streamlining your puppet development workflow

Tomas  Doran  @bobtfish  2014-­‐07-­‐07

Page 2: Steamlining your puppet development workflow

Why invest in your workflow?

2

Page 3: Steamlining your puppet development workflow

More time

3

Page 4: Steamlining your puppet development workflow

To concentrate on

4

Page 5: Steamlining your puppet development workflow

The important things in life

5

Page 6: Steamlining your puppet development workflow

Like dwarf fortress!

6

Page 7: Steamlining your puppet development workflow

Why invest in your workflow?• Productivity!

• Work smarter, not harder

• You spend a lot of time writing/testing/debugging code • Optimizing that is worthwhile

• Faster development cycle is more productive • 5% faster cycle • 5% more time for testing • Less bugs

7

Page 8: Steamlining your puppet development workflow

Revision control

• You must have your code in revision control

• git is preferred • fast + cheap branches • everyone else uses it • github • gitolite

!• svn is also ‘workable’

8

Page 9: Steamlining your puppet development workflow

How do you run puppet?

• I like cron (daemon also fine) • Two possible approaches • —noop mode automatically + manual apply • Automatic apply

9

Page 10: Steamlining your puppet development workflow

How do you run puppet?

• I like cron (daemon also fine) • Two possible approaches • —noop mode automatically + manual apply • Automatic apply

10

Page 11: Steamlining your puppet development workflow

How do you run puppet?

• I like cron (daemon also fine) • Two possible approaches • —noop mode automatically + manual apply • Automatic apply

• I recommend automatic apply • Scary (don’t push to master unless you’re

confident!) • puppet agent —disable (monitor this!) • Testing workflow • Eventual consistency

11

Page 12: Steamlining your puppet development workflow

Move just fast enough to not break everything

• Test so that you’re confident • Branch for every significant change • Reduce batch size • Small scary change easier to test • Easier to roll back

• Otherwise - applying months of changes at once • Really scary! • Don’t even know desired effects!

• Communicate!

12

Page 13: Steamlining your puppet development workflow

Standalone modepuppet apply --modulepath modules/:vendor/modules/ --show_diff --hiera_config=./standalone-hiera.yaml $@ manifests/site-standalone.pp !

13

Page 14: Steamlining your puppet development workflow

—noop

• Use —noop mode for testing!

ssh -A "$HOST" -- "sh -c 'cd $DESTDIR/$PUPPET_DIRNAME; ./tools/puppet-standalone --verbose --show_diff —noop'"

• tools/what-would-happen-on

14

Page 15: Steamlining your puppet development workflow

Dynamic environmentsgit branch => puppet environment

puppet agent -t —environment my_test_branch !

• puppet >= 2.7 has environment support

• Use puppetupdate or r10k to push branches (Links at the end!)

15

Page 16: Steamlining your puppet development workflow

16

Page 17: Steamlining your puppet development workflow

Reporting

• Need to know what puppet did • Puppet has logs + reporting functionality • Push reports to: • irc • email (eww!) • elasticsearch • mysql • puppetdb

• Saves compiled catalogs to disk tools/what-just-happened-on

17

Page 18: Steamlining your puppet development workflow

Foreman

18

Page 19: Steamlining your puppet development workflow

Norman

19

Page 20: Steamlining your puppet development workflow

Puppet enterprise

20

Page 21: Steamlining your puppet development workflow

puppet-syntax

• Ruby gem • Trivial to add to your project • Checks .pp, .erb, .yaml • Fast enough to run pre-commit

echo ‘bundle exec rake syntax’ \ >.git/hooks/pre-commit \ chmod 755 .git/hooks/pre-commit

21

Page 22: Steamlining your puppet development workflow

r10k/librarian - Puppetfile• Awesome module deployment - with robots! • Easy vendor/modules directory for modules from the forge • Makes module = git repository pattern easier • Not every module from the forge is useable immediately

• Fork on github (and make your changes open source)? • Pull request and get them back upstream! • Fork into internal git and modify.

• gitolite mirrors • Improve performance • No external dependencies

• Private forge (puppet-library)22

Page 23: Steamlining your puppet development workflow

Module template

• ‘puppet module generate’ uses a template • Start from the GDS example one:

github.com/gds-operations/puppet-module-skeleton • Modify to your taste!

23

Page 24: Steamlining your puppet development workflow

‘Real’ testing

• No hard rules. • Invest to the level that’s right for you!

• Dev heavy teams • Know about unit testing!

• Sysadmin heavy teams • Less enthusiastic

• Do what provides value!24

Page 25: Steamlining your puppet development workflow

Feedback!

• Tighten your OODA loop! • Don’t care how! • N.B. Automated tests don’t work unless they’re

automated. • I.E. MUST run on commit

• Whatever’s effective for your org25

Page 26: Steamlining your puppet development workflow

rspec-puppet

• Unit testing • At least write a compile test for your code! • Put it in your module template. • Explicit dependencies FTW

!• Use puppetlabs-spec-helper • Inject mocks into spec/fixtures/manifests/site.pp

echo ‘define my::complex::dependency ($foo, $bar) {}’ >> spec/fixtures/manifests/site.pp

26

Page 27: Steamlining your puppet development workflow

serverspec

• Spin up Vagrant VM and apply your code • Check properties of: • files • ports • services

• Acceptance testing • Slower and heavier weight than unit tests • Can be highly valuable!

27

Page 28: Steamlining your puppet development workflow

Jenkins - simple• Put your tests together so that they can be run as one job

!rake test

task :test => [:syntax, :spec, :integration]

• Get Jenkins to run it on commit to master • git polling • + add a post-receive hook to curl Jenkins

• Shout in email + irc!28

Page 29: Steamlining your puppet development workflow

Jenkins - less simple

• If branches are cheap (i.e. git!) • Encourages people to push branches • Code review++ • Adhoc • Or pick your poison

• Run syntax checks and unit and/or integration tests on every branch.

• Report back to committer • irc notification • write in code review

29

Page 30: Steamlining your puppet development workflow

Jenkins integration branches• Jenkins can merge branches! • Push a branch • Jenkins picks it up • Merges with master • Runs tests • If they pass, pushes results

30

Page 31: Steamlining your puppet development workflow

Jenkins integration branches• Jenkins can merge branches! • Push a branch • Jenkins picks it up • Merges with master • Runs tests • If they pass, pushes results

31

Page 32: Steamlining your puppet development workflow

Do everything in irc

32

Page 33: Steamlining your puppet development workflow

True believers

33

Page 34: Steamlining your puppet development workflow

34

Page 35: Steamlining your puppet development workflow

Policy vs Automation

• Testing is awesome • Code review is awesome • ‘Process is the scar tissue from previous problems’ • Empower people to change the process!

• If you make the tools simple to use… • People will use them! • Make doing the right thing a no-brainer

35

Page 36: Steamlining your puppet development workflow

We’re hiring! NY, SF, Dublin, London! !

• https://slideshare.net/bobtfish/ • http://puppetlabs.com/blog/git-workflow-and-puppet-environments • http://garylarizza.com/blog/2014/02/17/puppet-workflow-part-1/ • http://garylarizza.com/blog/2014/02/18/puppet-workflow-part-3/ • https://github.com/youdevise/puppetupdate • https://github.com/adrienthebo/r10k • http://gitolite.com/gitolite/index.html • http://puppetlabs.com/puppet/puppet-enterprise/ • http://docs.puppetlabs.com/guides/reporting.html • http://theforeman.org/ • https://github.com/youdevise/norman/ • https://github.com/youdevise/puppet-logstash-reporter/ • https://github.com/gds-operations/puppet-module-skeleton • https://github.com/drrb/puppet-library 36