Customizing Chef
For Fun and Profit
@jonlives
Jon Cowie
Sr Operations Engineer
@jonlives
@jonlives
@jonlives
Beginning of 2010 Today
@jonlives
Chef at Etsy
@jonlives
Chef at Etsy
• Open Source Chef Server

• ~1500 Nodes

• CentOS, some Mac OS X
@jonlives
We Love Chef!
@jonlives
We Know Best.
@jonlives
Absorb what is
useful.
Discard what is
useless.
@jonlives
“I am not smart enough to
build an ontology … that
can encompass all the
variations in infrastructure.
Nobody is...
@jonlives
There is no
magic pill.
@jonlives
You are the
expert.
@jonlives
Customizability
@jonlives
@jonlives
Thin Server
@jonlives
Thick Client
@jonlives
@jonlives
Get Config Data / Initialize
• Load client.rb
• Server URL
• Auth Credentials
• Paths
• Run ohai
• Collect attri...
@jonlives
Ohai Plugins
• Add attributes to your
node
• Executed at start of
run
• Single Ruby file
• Highest precedence
@jonlives
Ohai Plugins - v6
provides ‘awesome’
!
awesome Mash.new
awesome[:sauce] = "Sricacha"
awesome[:level] = "11"
@jonlives
Ohai Plugins - v7 (Coming soon!)
Ohai.plugin(:Awesome) do
provides "awesome"
collect_data(:darwin) do
awesome Ma...
@jonlives
Ohai Plugins - client.rb / solo.rb
Ohai::Config[:plugin_path] << /<path>/plugins
@jonlives
Authenticate / Register
• Authenticate to Server
• <clientkey>.pem
• Register if not already
registered
• <valid...
@jonlives
Load / Build Node
• Download node
• Combine attributes
• Expand run_list
• Order matters!
• Create RunStatus
obj...
@jonlives
Handlers
• Respond to specific
situations
• Start, Report, Exception
• Common Code
@jonlives
Handlers - Common Code
require "chef/handler"
!
class HandlerName < Chef::Handler
def report
# Ruby code goes he...
@jonlives
Handlers - client.rb / solo.rb
require “/path_to/mystarthandler.rb"
!
my_start_handler = MyStartHandler.new
!
st...
@jonlives
Synchronize Cookbooks
• Get cookbook files list
• Only required recipes,
files & templates
• Compares to local
c...
@jonlives
Set up RunContext
• Cookbook Collection
• Definitions List
• Events
• Notifications
• Node
• Resource Collection...
@jonlives
Events
• Respond to interesting
events
• Pub / Sub model
• EventDispatch::Base
• Formatter
• Custom Subscriber
@jonlives
Events - Custom Subscriber
require “chef/event_dispatch/base"
!
class AwesomeSubscriber < Chef::EventDispatch::B...
@jonlives
Events - Register Subscriber
require "chef/handler"
require “/path/awesome_subscriber.rb'
!
class AwesomeSubscri...
@jonlives
Load Cookbook Data
• Populate Resource
Collection
• Libraries
• Attributes
• Resources / Providers
• Definitions...
@jonlives
Converge Node
• Actually changes node
• Apply resource
collection
• Again, order matters!
@jonlives
Finalize
• Successful Run
• Save Node
• Report Handlers
• Failed Run
• Exception Handlers
• 💩
@jonlives
Report & Exception Handlers
def report
if @run_status.success?
# Do a happy dance
elsif @run_status.failed?
# Sa...
@jonlives
Handlers - client.rb / solo.rb
require “/var/chef/handlers/mystarthandler.rb"
require "/var/chef/handlers/mynewh...
@jonlives
That RunStatus Object Again…
• Accessible to handlers
• Run status & timings
• Exception and Backtrace
• All & u...
@jonlives
Don’t fear the code!
• https://github.com/opscode/chef
• lib/chef/handler.rb
• lib/chef/run_status.rb
• lib/chef...
@jonlives
Um…wat?
@jonlives
Criteria for Customization
Simplicity
Modularity
Visibility
Maintainability
Scalability
@jonlives
November 2014
!
http://jonliv.es/book
!
O’Reilly Stand
@jonlives
Thanks!
Questions?
!
Office Hours @ 3.15, Marina Room
@jonlives / http://jonliv.es / jcowie@etsy.com
Customizing Chef for Fun and Profit
Upcoming SlideShare
Loading in …5
×

Customizing Chef for Fun and Profit

6,823 views

Published on

Chefconf 2014

Published in: Technology, Self Improvement
0 Comments
18 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,823
On SlideShare
0
From Embeds
0
Number of Embeds
61
Actions
Shares
0
Downloads
54
Comments
0
Likes
18
Embeds 0
No embeds

No notes for slide

Customizing Chef for Fun and Profit

  1. Customizing Chef For Fun and Profit
  2. @jonlives Jon Cowie Sr Operations Engineer
  3. @jonlives
  4. @jonlives
  5. @jonlives Beginning of 2010 Today
  6. @jonlives Chef at Etsy
  7. @jonlives Chef at Etsy • Open Source Chef Server
 • ~1500 Nodes
 • CentOS, some Mac OS X
  8. @jonlives We Love Chef!
  9. @jonlives We Know Best.
  10. @jonlives Absorb what is useful. Discard what is useless.
  11. @jonlives “I am not smart enough to build an ontology … that can encompass all the variations in infrastructure. Nobody is, the world moves too fast.”
  12. @jonlives There is no magic pill.
  13. @jonlives You are the expert.
  14. @jonlives Customizability
  15. @jonlives
  16. @jonlives Thin Server
  17. @jonlives Thick Client
  18. @jonlives
  19. @jonlives Get Config Data / Initialize • Load client.rb • Server URL • Auth Credentials • Paths • Run ohai • Collect attributes • Plugins!
  20. @jonlives Ohai Plugins • Add attributes to your node • Executed at start of run • Single Ruby file • Highest precedence
  21. @jonlives Ohai Plugins - v6 provides ‘awesome’ ! awesome Mash.new awesome[:sauce] = "Sricacha" awesome[:level] = "11"
  22. @jonlives Ohai Plugins - v7 (Coming soon!) Ohai.plugin(:Awesome) do provides "awesome" collect_data(:darwin) do awesome Mash.new awesome[:sauce] = “Sriracha" awesome[:level] = 11 end end
  23. @jonlives Ohai Plugins - client.rb / solo.rb Ohai::Config[:plugin_path] << /<path>/plugins
  24. @jonlives Authenticate / Register • Authenticate to Server • <clientkey>.pem • Register if not already registered • <validation>.pem • If both fail, go directly to jail.
  25. @jonlives Load / Build Node • Download node • Combine attributes • Expand run_list • Order matters! • Create RunStatus object • Run start handlers
  26. @jonlives Handlers • Respond to specific situations • Start, Report, Exception • Common Code
  27. @jonlives Handlers - Common Code require "chef/handler" ! class HandlerName < Chef::Handler def report # Ruby code goes here end end
  28. @jonlives Handlers - client.rb / solo.rb require “/path_to/mystarthandler.rb" ! my_start_handler = MyStartHandler.new ! start_handlers << my_start_handler
  29. @jonlives Synchronize Cookbooks • Get cookbook files list • Only required recipes, files & templates • Compares to local cache • Download changes
  30. @jonlives Set up RunContext • Cookbook Collection • Definitions List • Events • Notifications • Node • Resource Collection • Empty for now…
  31. @jonlives Events • Respond to interesting events • Pub / Sub model • EventDispatch::Base • Formatter • Custom Subscriber
  32. @jonlives Events - Custom Subscriber require “chef/event_dispatch/base" ! class AwesomeSubscriber < Chef::EventDispatch::Base def run_started(run_status) … end # Method for each interesting event end
  33. @jonlives Events - Register Subscriber require "chef/handler" require “/path/awesome_subscriber.rb' ! class AwesomeSubscriberStartHandler < Chef::Handler def report event_dispatcher_subscriber = AwesomeSubscriber.new @run_status.events.register(event_dispatcher_subscriber) end end
  34. @jonlives Load Cookbook Data • Populate Resource Collection • Libraries • Attributes • Resources / Providers • Definitions • Recipes
  35. @jonlives Converge Node • Actually changes node • Apply resource collection • Again, order matters!
  36. @jonlives Finalize • Successful Run • Save Node • Report Handlers • Failed Run • Exception Handlers • 💩
  37. @jonlives Report & Exception Handlers def report if @run_status.success? # Do a happy dance elsif @run_status.failed? # Sad panda. end end
  38. @jonlives Handlers - client.rb / solo.rb require “/var/chef/handlers/mystarthandler.rb" require "/var/chef/handlers/mynewhandler.rb" ! my_start_handler = MyStartHandler.new my_new_handler = MyNewHandler.new ! start_handlers << my_start_handler report_handlers << my_new_handler exception_handlers << my_new_handler
  39. @jonlives That RunStatus Object Again… • Accessible to handlers • Run status & timings • Exception and Backtrace • All & updated resources • RunContext • Node object
  40. @jonlives Don’t fear the code! • https://github.com/opscode/chef • lib/chef/handler.rb • lib/chef/run_status.rb • lib/chef/run_context.rb • lib/chef/event_dispatch/base.rb
  41. @jonlives Um…wat?
  42. @jonlives Criteria for Customization Simplicity Modularity Visibility Maintainability Scalability
  43. @jonlives November 2014 ! http://jonliv.es/book ! O’Reilly Stand
  44. @jonlives Thanks! Questions? ! Office Hours @ 3.15, Marina Room @jonlives / http://jonliv.es / jcowie@etsy.com

×