SlideShare a Scribd company logo
1 of 180
Download to read offline
Michelin Starred
Cooking with Chef
    Jon Cowie, Etsy.com
      jcowie@etsy.com
          @jonlives
What?
What?
• Chef at Etsy
What?
• Chef at Etsy
• Familiarity and Understanding
What?
• Chef at Etsy
• Familiarity and Understanding
• Critical Approach and Experimentation
What?
• Chef at Etsy
• Familiarity and Understanding
• Critical Approach and Experimentation
• Use The Source
What?
• Chef at Etsy
• Familiarity and Understanding
• Critical Approach and Experimentation
• Use The Source
• A liberal sprinkling of screwups
What?
• Chef at Etsy
• Familiarity and Understanding
• Critical Approach and Experimentation
• Use The Source
• A liberal sprinkling of screwups
• Open Sourced Goodness - We’re all here!
What?
• Chef at Etsy
• Familiarity and Understanding
• Critical Approach and Experimentation
• Use The Source
• A liberal sprinkling of screwups
• Open Sourced Goodness - We’re all here!
 • [x] = http://tiny.cc/velocity2012
Opscode is Orange,
  Velocity is Blue.
  In Soviet Russia,
Cookbook writes you.
Chef at Etsy
Our Setup
Our Setup
• Open Source chef server 0.10.4
Our Setup
• Open Source chef server 0.10.4
• Backup to Opscode Platform
Our Setup
• Open Source chef server 0.10.4
• Backup to Opscode Platform
• ~800 self-hosted nodes (Mainly CentOS,
  some RHEL & mac)
Our Setup
• Open Source chef server 0.10.4
• Backup to Opscode Platform
• ~800 self-hosted nodes (Mainly CentOS,
  some RHEL & mac)
• KVM & lxc virts, self hosted too.
Our Setup
• Open Source chef server 0.10.4
• Backup to Opscode Platform
• ~800 self-hosted nodes (Mainly CentOS,
  some RHEL & mac)
• KVM & lxc virts, self hosted too.
• Never test in production!
Our Setup
• Open Source chef server 0.10.4
• Backup to Opscode Platform
• ~800 self-hosted nodes (Mainly CentOS,
  some RHEL & mac)
• KVM & lxc virts, self hosted too.
• Never test in production!
• Many chefs don’t spoil our soup
Our Setup
• Open Source chef server 0.10.4
• Backup to Opscode Platform
• ~800 self-hosted nodes (Mainly CentOS,
  some RHEL & mac)
• KVM & lxc virts, self hosted too.
• Never test in production!
• Many chefs don’t spoil our soup
Familiarity and
Understanding
not



http://www.flickr.com/photos/photo_secessionist/5555167113/         (C) Alexander McQueen
Michelin Starred Cooking with Chef
• Insight
• Insight
• Simplicity
• Insight
• Simplicity
• Standards
Insight
Insight

• You should never have to say “I don’t
  know.”
Insight

• You should never have to say “I don’t
  know.”
• What, where, when, why, how long?
Insight

• You should never have to say “I don’t
  know.”
• What, where, when, why, how long?
• Easy, and I’ll show you how!
Michelin Starred Cooking with Chef
Chef Dashboard
Chef Dashboard
•   Chef handler sends metrics to graphite [4]
Chef Dashboard
•   Chef handler sends metrics to graphite [4]
    • git clone git://github.com/etsy/chef-handlers.git
Chef Dashboard
•   Chef handler sends metrics to graphite [4]
    • git clone git://github.com/etsy/chef-handlers.git
    •   Set your graphite server’s URL in
        graphite.rb
Chef Dashboard
•   Chef handler sends metrics to graphite [4]
    • git clone git://github.com/etsy/chef-handlers.git
    •   Set your graphite server’s URL in
        graphite.rb
    •   Add the following to client.rb
Chef Dashboard
•   Chef handler sends metrics to graphite [4]
    • git clone git://github.com/etsy/chef-handlers.git
    •   Set your graphite server’s URL in
        graphite.rb
    •   Add the following to client.rb
        • require "<clonedir>/graphite.rb"
           graphite_handler = GraphiteReporting.new
           report_handlers    << graphite_handler
           exception_handlers << graphite_handler
Chef Dashboard
•   Chef handler sends metrics to graphite [4]
    • git clone git://github.com/etsy/chef-handlers.git
    •   Set your graphite server’s URL in
        graphite.rb
    •   Add the following to client.rb
        • require "<clonedir>/graphite.rb"
           graphite_handler = GraphiteReporting.new
           report_handlers    << graphite_handler
           exception_handlers << graphite_handler


•   Etsy dashboards framework [5]
[12:54:01] <irccat> Chef run failed on gfernandez.vm.ny4dev.etsy.com
[12:54:02] <irccat> https://github.etsycorp.com/gist/384228
[12:54:02] <irccat>


[12:54:07] <irccat> Chef run failed on buildtest11.ny4dev.etsy.com
[12:54:07] <irccat> https://github.etsycorp.com/gist/384227
[12:54:07] <irccat>
Chef irccat Alerts
Chef irccat Alerts
•   Chef handler send fails to irc[4] via irccat [6]
Chef irccat Alerts
•   Chef handler send fails to irc[4] via irccat [6]
    • git clone git://github.com/etsy/chef-handlers.git
Chef irccat Alerts
•   Chef handler send fails to irc[4] via irccat [6]
    • git clone git://github.com/etsy/chef-handlers.git
    •   Set your irccat[6] server’s URL in
        logtoirc.rb
Chef irccat Alerts
•   Chef handler send fails to irc[4] via irccat [6]
    • git clone git://github.com/etsy/chef-handlers.git
    •   Set your irccat[6] server’s URL in
        logtoirc.rb
    •   Add the following to client.rb
Chef irccat Alerts
•   Chef handler send fails to irc[4] via irccat [6]
    • git clone git://github.com/etsy/chef-handlers.git
    •   Set your irccat[6] server’s URL in
        logtoirc.rb
    •   Add the following to client.rb
        • require "<clonedir>/logtoirc.rb"
           exception_handlers << Etsy::LogToIRC.new
~ > knife node lastrun buildtest11.ny4dev.etsy.com
Status                     failed
Elapsed Time               4.628171438
Start Time                 2012-06-18 10:06:28 +0000
End Time                   2012-06-18 10:06:32 +0000

Recipe         Action         Resource Type   Resource

Backtrace
<snip>

Exception
Chef::Exceptions::Package: package[php] (php::buildtest line 20) had
an error: Version 5.3.10-1.el5 of php not found. Did you specify both
version and release? (version-release, e.g. 1.84-10.fc6)
~ > knife search node 'lastrun_debug_formatted_exception:Chef:
:Exceptions::Package*' -a lastrun.debug.formatted_exception

5 items found

id:    masterrestore.ny4.etsy.com
lastrun.debug.formatted_exception: Chef::Exceptions::Package:
package[postgresql-server] (postgresql::server-8.3 line 1) had an
error: Installed package postgresql-server-8.3.16-1PGDG_id is newer
than candidate package postgresql-server-8.3.11-1PGDG_id.rhel5

id:    buildtest11.ny4dev.etsy.com
lastrun.debug.formatted_exception: Chef::Exceptions::Package:
package[php] (php::buildtest line 20) had an error: Version
5.3.10-1.el5 of php not found. Did you specify both version and
release? (version-release, e.g. 1.84-10.fc6)

<snip>
Chef lastrun Info
Chef lastrun Info
•   Chef handler and knife plugin [7]
Chef lastrun Info
•   Chef handler and knife plugin [7]
    •   gem install knife-lastrun
Chef lastrun Info
•   Chef handler and knife plugin [7]
    •   gem install knife-lastrun
    •   Add the following to client.rb
Chef lastrun Info
•   Chef handler and knife plugin [7]
    •   gem install knife-lastrun
    •   Add the following to client.rb
        • require "lastrun_update"
          handler = LastRunUpdateHandler.new
          report_handlers    << handler
          exception_handlers << handler
Chef lastrun Info
•   Chef handler and knife plugin [7]
    •   gem install knife-lastrun
    •   Add the following to client.rb
        • require "lastrun_update"
          handler = LastRunUpdateHandler.new
          report_handlers    << handler
          exception_handlers << handler


    •   knife node lastrun <nodename>
Simplicity
Simplicity

• Think of yourself at 3AM!
Simplicity

• Think of yourself at 3AM!
• Please, won’t you think of the new guy?
Simplicity

• Think of yourself at 3AM!
• Please, won’t you think of the new guy?
• Minimize the logics!
Simplicity

• Think of yourself at 3AM!
• Please, won’t you think of the new guy?
• Minimize the logics!
 • As few logical steps from start to finish
    as possible.
Simplicity - Not!
   Date: Mon Dec 05 2011 23:07:18 GMT+0000 (GMT)

Subject: so close to death

# Don't install v2 on search or Cent 5.6 nodes
-if node[:fqdn] !~ /b(^(preprod-)?search[0-9]{2}|ny4dev.etsy.com|^(preprod-)?
giftsweb[0-9]{2}|^db(shard|spare|data)[0-9]{2}|^qa-web01|^devsearch[0-9]{2}|^nagios01|
^webnest[0-9]{2}|^prodking[0-9]{2}|^sandboxweb[0-9]{2}|^virt((0[5-9])|(1[0-9]))|
^msysmgr[0-9]{2}|^msysmta[0-9]{2}|^dbconvo[0-9]{2}|^dbshowcase01|atlasweb[0-9]{2}|
devnagios[0-9]{2}|cimaster02|worker[0-9]{2}|^ganglia[0-9]{2}|^imgcache[0-9]{2}|
imgconvert[0-9]{2}|^imgwriter[0-9]{2}|dev-img02|^datacache04|^graphite01|^graphite03|
^webutil03|^webutil04|^statsd01|^maintweb[0-9]{2}|^(dev-|preprod-)?convosearch[0-9]{2}|
deployinator[0-9]{2}|^wpadmin01|^(preprod-)?dbtasks[0-9]{2})b/ and node.role?("Web56") ==
false and node.role?("Preprodweb56") == false and node.role?("Princess53") == false
+if node[:fqdn] !~ /b(^(preprod-)?search[0-9]{2}|ny4dev.etsy.com|^(preprod-)?
giftsweb[0-9]{2}|^db(shard|spare|data)[0-9]{2}|^qa-web01|^devsearch[0-9]{2}|^nagios01|
^webnest[0-9]{2}|^prodking[0-9]{2}|^sandboxweb[0-9]{2}|^virt((0[5-9])|(1[0-9]))|
^msysmgr[0-9]{2}|^msysmta[0-9]{2}|^dbconvo[0-9]{2}|^dbshowcase01|atlasweb[0-9]{2}|
devnagios[0-9]{2}|cimaster02|worker[0-9]{2}|^ganglia[0-9]{2}|^imgcache[0-9]{2}|
imgconvert[0-9]{2}|^imgwriter[0-9]{2}|dev-img02|^datacache04|^graphite01|^graphite03|
^webutil03|^webutil04|^statsd01|^maintweb[0-9]{2}|^(dev-|preprod-)?convosearch[0-9]{2}|
deployinator[0-9]{2}|^wpadmin01|^(preprod-)?dbtasks[0-9]{2})b/ and node.role?("Web56") ==
false and node.role?("Preprodweb56") == false and node.role?("Princess53") == false and
node.role?("Auth") == false
Simplicity - Better!
if node.chef_environment == "libmemcached_upgrade"
  package "libmemcached" do
       version "1.0.4-1"
       action :install
  end
  <snip>
else
  package "libmemcached" do
       version "0.53-1.1"
       action :install
  end
  <snip>
end
Simplicity - Complexity
Simplicity - Complexity

• Sometimes you need complex behaviour
Simplicity - Complexity

• Sometimes you need complex behaviour
• Don’t fight it, try to abstract it.
Simplicity - Complexity

• Sometimes you need complex behaviour
• Don’t fight it, try to abstract it.
• Case in point: Syslog-ng refactor
Case Study: Syslog-ng
Case Study: Syslog-ng

• 36 recipes
Case Study: Syslog-ng

• 36 recipes
• 30 versions of syslog-ng.conf
Case Study: Syslog-ng

• 36 recipes
• 30 versions of syslog-ng.conf
• 27 manually configured files in /etc/syslog-
  ng.d on central server
Case Study: Syslog-ng

• 36 recipes
• 30 versions of syslog-ng.conf
• 27 manually configured files in /etc/syslog-
  ng.d on central server
• Edge cases and exceptions galore
Case Study: Syslog-ng
Case Study: Syslog-ng
• Down to:
Case Study: Syslog-ng
• Down to:
 • 2 recipes (one client, one server)
Case Study: Syslog-ng
• Down to:
 • 2 recipes (one client, one server)
 • 2 templates (one for syslog-ng.conf, one
    for stuff in /etc/syslog-ng.d)
Case Study: Syslog-ng
• Down to:
 • 2 recipes (one client, one server)
 • 2 templates (one for syslog-ng.conf, one
    for stuff in /etc/syslog-ng.d)
 • Attributes in roles
Case Study: Syslog-ng
• Down to:
 • 2 recipes (one client, one server)
 • 2 templates (one for syslog-ng.conf, one
    for stuff in /etc/syslog-ng.d)
 • Attributes in roles
 • Not open sourced yet, sorry :(
Case Study: Syslog-ng
"syslog": {
    "group": "preprod_web",
    "items": {
         "web_apache_access_log": {
              "source": "/var/log/httpd/access_log",
              "source_program_override": "APACHEACCESS: ",
              "destination": "<snip>/access.log",
              "destination_filters": [
                   "host('^preprod-web')",
                   "match('APACHEACCESS')"
              ],
              "destination_options": [
                   "template_escape(no)"
              ]
         },
     }
}
Remember, No
  Panacea!
Remember, No
       Panacea!
• A new package hits the repo.
Remember, No
       Panacea!
• A new package hits the repo.
 • Are you in control of when it goes out?
Remember, No
       Panacea!
• A new package hits the repo.
 • Are you in control of when it goes out?
   • Memcached Outage
Remember, No
       Panacea!
• A new package hits the repo.
 • Are you in control of when it goes out?
   • Memcached Outage
• Do you know what services are going to
  restart and when?
Remember, No
       Panacea!
• A new package hits the repo.
 • Are you in control of when it goes out?
   • Memcached Outage
• Do you know what services are going to
  restart and when?
 • Image Service Outage
Standards
Standards


• Not going to talk about testing [8]!
Standards


• Not going to talk about testing [8]!
• But I don’t have time for standards!
Standards - No Time!
Standards - No Time!
• I won’t say “Make Time”, but you should...
Standards - No Time!
• I won’t say “Make Time”, but you should...
• For a quick win, try Foodcritic
Standards - No Time!
• I won’t say “Make Time”, but you should...
• For a quick win, try Foodcritic
 • Good out of the box rules
Standards - No Time!
• I won’t say “Make Time”, but you should...
• For a quick win, try Foodcritic
 • Good out of the box rules
 • Jenkins integration in seconds
Standards - No Time!
• I won’t say “Make Time”, but you should...
• For a quick win, try Foodcritic
 • Good out of the box rules
 • Jenkins integration in seconds
 • Supports custom rules
Standards - No Time!
• I won’t say “Make Time”, but you should...
• For a quick win, try Foodcritic
 • Good out of the box rules
 • Jenkins integration in seconds
 • Supports custom rules
 • Plays well with others
Foodcritic
Foodcritic
•gem install foodcritic
Foodcritic
•gem install foodcritic
•foodcritic <cookbook_repo>
Foodcritic
•gem install foodcritic
•foodcritic <cookbook_repo>
•Simple Jenkins job:
Foodcritic
•gem install foodcritic
•foodcritic <cookbook_repo>
•Simple Jenkins job:
#!/usr/bin/env rvm-shell 1.9.3
foodcritic -f correctness .
Standards at Etsy
Standards at Etsy
• “style” not “correctness”[9]
Standards at Etsy
• “style” not “correctness”[9]
 •   ETSY001 - Package or yum_package resource used with :upgrade action
Standards at Etsy
• “style” not “correctness”[9]
 •   ETSY001 - Package or yum_package resource used with :upgrade action

 •   ETSY002 - Execute resource used to run git commands
Standards at Etsy
• “style” not “correctness”[9]
 •   ETSY001 - Package or yum_package resource used with :upgrade action

 •   ETSY002 - Execute resource used to run git commands

 •   ETSY003 - Execute resource used to run curl or wget commands
Standards at Etsy
• “style” not “correctness”[9]
 •   ETSY001 - Package or yum_package resource used with :upgrade action

 •   ETSY002 - Execute resource used to run git commands

 •   ETSY003 - Execute resource used to run curl or wget commands

 •   ETSY004 - Execute resource defined without conditional or
     action :nothing
Standards at Etsy
• “style” not “correctness”[9]
 •   ETSY001 - Package or yum_package resource used with :upgrade action

 •   ETSY002 - Execute resource used to run git commands

 •   ETSY003 - Execute resource used to run curl or wget commands

 •   ETSY004 - Execute resource defined without conditional or
     action :nothing

 •   ETSY005 - Action :restart sent to a core service
Standards at Etsy
• “style” not “correctness”[9]
 •   ETSY001 - Package or yum_package resource used with :upgrade action

 •   ETSY002 - Execute resource used to run git commands

 •   ETSY003 - Execute resource used to run curl or wget commands

 •   ETSY004 - Execute resource defined without conditional or
     action :nothing

 •   ETSY005 - Action :restart sent to a core service

 •   ETSY006 - Execute resource used to run chef-provided command
Standards at Etsy
• “style” not “correctness”[9]
 •   ETSY001 - Package or yum_package resource used with :upgrade action

 •   ETSY002 - Execute resource used to run git commands

 •   ETSY003 - Execute resource used to run curl or wget commands

 •   ETSY004 - Execute resource defined without conditional or
     action :nothing

 •   ETSY005 - Action :restart sent to a core service

 •   ETSY006 - Execute resource used to run chef-provided command

 •   ETSY007 - Package or yum_package resource used to install core
     package without specific version number
Standards at Etsy
• “style” not “correctness”[9]
 •   ETSY001 - Package or yum_package resource used with :upgrade action

 •   ETSY002 - Execute resource used to run git commands

 •   ETSY003 - Execute resource used to run curl or wget commands

 •   ETSY004 - Execute resource defined without conditional or
     action :nothing

 •   ETSY005 - Action :restart sent to a core service

 •   ETSY006 - Execute resource used to run chef-provided command

 •   ETSY007 - Package or yum_package resource used to install core
     package without specific version number
Standards at Etsy
Standards at Etsy
• ETSY001 - Written after Memcached
  Outage
Standards at Etsy
• ETSY001 - Written after Memcached
  Outage
• Package or yum_package resource used
  with :upgrade action
Standards at Etsy
• ETSY001 - Written after Memcached
  Outage
• Package or yum_package resource used
  with :upgrade action
• package "memcached" do
    action :upgrade
  end
Standards at Etsy
Standards at Etsy

• ETSY005 - Written after a total Image
  service outage
Standards at Etsy

• ETSY005 - Written after a total Image
  service outage
• Action :restart sent to a core service
Standards at Etsy

• ETSY005 - Written after a total Image
    service outage
• Action :restart sent to a core service
•   cookbook_file "/etc/httpd/conf.d/myvhost.conf" do
      source "myvhost.conf"
      notifies :restart, resources(:service => "httpd")
    end
Critical Approach and
  Experimentation
CA&E
CA&E

• Chef is by necessity generic
CA&E

• Chef is by necessity generic
• ...so don’t take Opscode’s word for it.
CA&E

• Chef is by necessity generic
• ...so don’t take Opscode’s word for it.
• If it doesn’t work well for you, change it!
CA&E

• Chef is by necessity generic
• ...so don’t take Opscode’s word for it.
• If it doesn’t work well for you, change it!
• Case Study - Etsy Environments rollout
Environments Rollout
Environments Rollout

• We knew we needed them
Environments Rollout

• We knew we needed them
• Simple enough, right?
Environments Rollout

• We knew we needed them
• Simple enough, right?
• Let’s look at the workflow...
Env: Standard Workflow
Env: Standard Workflow
 • knife cookbook show php
Env: Standard Workflow
 • knife cookbook show php
 • Change version number in metadata.rb
Env: Standard Workflow
 • knife cookbook show php
 • Change version number in metadata.rb
 • Change version constraint in foo.json
Env: Standard Workflow
 • knife cookbook show php
 • Change version number in metadata.rb
 • Change version constraint in foo.json
 • Commit and push changes to git
Env: Standard Workflow
 • knife cookbook show php
 • Change version number in metadata.rb
 • Change version constraint in foo.json
 • Commit and push changes to git
 • knife cookbook upload php --freeze
Env: Standard Workflow
 • knife cookbook show php
 • Change version number in metadata.rb
 • Change version constraint in foo.json
 • Commit and push changes to git
 • knife cookbook upload php --freeze
 • knife environment from file foo.json
Env: Our Issues
Env: Our Issues

• 41 people with Chef repo access
Env: Our Issues

• 41 people with Chef repo access
• Most with knife keys
Env: Our Issues

• 41 people with Chef repo access
• Most with knife keys
• All editing the same 2 files with every
  change...
Env: Solutions?
Env: Solutions?

• Go with it and hope for the best?
Env: Solutions?

• Go with it and hope for the best?
• Don’t use environments?
Env: Solutions?

• Go with it and hope for the best?
• Don’t use environments?
• Write a totally new workflow?
Env: Solutions?

• Go with it and hope for the best?
• Don’t use environments?
• Write a totally new workflow?
• Tweak the existing one with some
  tooling?
Env: Solution!
Env: Solution!


• Tweak with some tooling!
Env: Solution!


• Tweak with some tooling!
• Presenting knife-spork [10]...
Spork: Workflow
Spork: Workflow
• Wrapper around standard environments
  workflow
Spork: Workflow
• Wrapper around standard environments
  workflow
 • check - cookbook versioning
Spork: Workflow
• Wrapper around standard environments
  workflow
 • check - cookbook versioning
 • bump - increment version component
Spork: Workflow
• Wrapper around standard environments
  workflow
 • check - cookbook versioning
 • bump - increment version component
 • upload - upload and freeze
Spork: Workflow
• Wrapper around standard environments
  workflow
 • check - cookbook versioning
 • bump - increment version component
 • upload - upload and freeze
 • promote - set env constraints
Spork: Check
$> knife spork check apache2

Checking versions for cookbook apache2...

Current local version: 1.0.6

Remote versions (Max. 5 most recent only):
*1.0.6, frozen
1.0.5, frozen
<snip>

DANGER: Your local cookbook has same version number as
the starred version above!

Please bump your local version or you won't be able to
upload.
Spork: Bump


$> knife spork bump apache2 <major|minor|patch|manual>

Bumping patch level of the apache2 cookbook from 1.0.6
to 1.0.7
Spork: Upload


$> knife spork upload apache2

Uploading and freezing apache2   [1.0.7]
upload complete
Spork: Promote
$> knife spork promote foo php

Adding version constraint php = 1.0.6

Saving changes into foo.json

Promotion complete! Please remember to upload your
changed Environment file to the Chef Server.

---

$> knife spork promote foo php --remote
Adding version constraint php = 0.1.0

Saving changes into foo.json

Uploading foo to server
Spork
Spork
• Worked well, avoided the issues it was
  designed for
Spork
• Worked well, avoided the issues it was
  designed for
• Subsequently evolved
Spork
• Worked well, avoided the issues it was
  designed for
• Subsequently evolved
 • A lot of input & work came from Devs
Spork
• Worked well, avoided the issues it was
  designed for
• Subsequently evolved
 • A lot of input & work came from Devs
 • Organic evolution
Spork
• Worked well, avoided the issues it was
  designed for
• Subsequently evolved
 • A lot of input & work came from Devs
 • Organic evolution
 • Open sourced, of course
Spork: Evolution
Spork: Evolution


• Safety Checks
Spork: Evolution


• Safety Checks
• Extra Features
Spork: Safety Checks
Spork: Safety Checks


• Before promoting, check version is
  uploaded...
Spork: Safety Checks
$> knife spork promote php --remote

<snip>

WARNING: It looks like you have multiple cookbook paths
defined so I can't tell if you're running inside a git
repo.

Checking that php version 0.1.93 exists on the server
before promoting (any error means it hasn't been
uploaded yet)...

ERROR: The object you are looking for could not be found

Response: Cannot find a cookbook named php with version
0.1.93
Spork: Safety Checks

• Before promoting, check version is
  uploaded...
• Check if you’re promoting changes to more
  than you thought....
Spork: Safety Checks
WARNING: You're about to promote changes to several
cookbooks:

WARNING:
ganglia: = 0.1.26 changed to = 0.1.25
installerz: = 0.1.66 changed to = 0.1.65
php: = 0.1.92 changed to = 0.1.93

Are you sure you want to continue? (Y/N) N

You said no, so I'm done here.

Would you like to reset your local development.json to
match the server?? (Y/N) Y

<snip>

development.json reset.
Spork: Features
Spork: Features
• Default Environments
Spork: Features
• Default Environments
• Git support
Spork: Features
• Default Environments
• Git support
• Chat notifications + Gist (upload and
  promote)
Spork: Features
• Default Environments
• Git support
• Chat notifications + Gist (upload and
  promote)
 • IRCCat
Spork: Features
• Default Environments
• Git support
• Chat notifications + Gist (upload and
  promote)
 • IRCCat
 • Hipchat (courtesy of Secondmarket)
Features: Chat
          Notifications

[19:43:46] <irccat> CHEF: pmcdonnell uploaded and froze
cookbook immount version 0.0.24

[19:44:00] <irccat> CHEF: pmcdonnell uploaded environment
production https://github.etsycorp.com/gist/385043

[19:44:01] <irccat> CHEF: pmcdonnell uploaded environment
development https://github.etsycorp.com/gist/385044
Spork: Features
• Default Environments
• Git support
• Chat notifications + Gist (upload and
  promote)
 • IRCCat
 • Hipchat (courtesy of Secondmarket)
• Graphite (on promote)
Features: Graphite
Spork: Features
• Default Environments
• Git support
• Chat notifications + Gist (upload and
  promote)
 • IRCCat
 • Hipchat (courtesy of Secondmarket)
• Graphite (on promote)
• Foodcritic (on upload)
Features: Foodcritic
$> knife spork upload system

<snip>

Lint checking system...

ERROR: Lint check failed. Halting upload.

ERROR: Lint check output:

ERROR: ETSY003: Execute resource used to run curl or
wget commands: /Users/jcowie/dev/etsy/chef/cookbooks/
system/recipes/dev-ssl.rb:41
Use the Source!
tiny.cc/velocity2012
We’re hiring!
     BoF on Tuesday
or just come and say Hi :)

More Related Content

What's hot

Chef Tutorial | Chef Tutorial For Beginners | DevOps Chef Tutorial | DevOps T...
Chef Tutorial | Chef Tutorial For Beginners | DevOps Chef Tutorial | DevOps T...Chef Tutorial | Chef Tutorial For Beginners | DevOps Chef Tutorial | DevOps T...
Chef Tutorial | Chef Tutorial For Beginners | DevOps Chef Tutorial | DevOps T...Simplilearn
 
How to Write Chef Cookbook
How to Write Chef CookbookHow to Write Chef Cookbook
How to Write Chef Cookbookdevopsjourney
 
Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015Jennifer Davis
 
Azure handsonlab
Azure handsonlabAzure handsonlab
Azure handsonlabChef
 
Automated Deployments with Ansible
Automated Deployments with AnsibleAutomated Deployments with Ansible
Automated Deployments with AnsibleMartin Etmajer
 
Introduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen SummitIntroduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen SummitJennifer Davis
 
Overview of Chef - Fundamentals Webinar Series Part 1
Overview of Chef - Fundamentals Webinar Series Part 1Overview of Chef - Fundamentals Webinar Series Part 1
Overview of Chef - Fundamentals Webinar Series Part 1Chef
 
Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...
Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...
Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...Edureka!
 
Test-Driven Infrastructure with Chef
Test-Driven Infrastructure with ChefTest-Driven Infrastructure with Chef
Test-Driven Infrastructure with ChefMichael Lihs
 
Chef-Zero & Local Mode
Chef-Zero & Local ModeChef-Zero & Local Mode
Chef-Zero & Local ModeMichael Goetz
 
Infrastructure Automation with Chef
Infrastructure Automation with ChefInfrastructure Automation with Chef
Infrastructure Automation with ChefJonathan Weiss
 
Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...
Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...
Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...Chef Software, Inc.
 
AWS Meetup - Sydney - February
AWS Meetup - Sydney - February AWS Meetup - Sydney - February
AWS Meetup - Sydney - February markghiasy
 
Compliance Automation Workshop
Compliance Automation WorkshopCompliance Automation Workshop
Compliance Automation WorkshopChef
 
Server Installation and Configuration with Chef
Server Installation and Configuration with ChefServer Installation and Configuration with Chef
Server Installation and Configuration with ChefRaimonds Simanovskis
 
CLUG 2014-10 - Cookbook CI with Jenkins
CLUG 2014-10 - Cookbook CI with JenkinsCLUG 2014-10 - Cookbook CI with Jenkins
CLUG 2014-10 - Cookbook CI with JenkinsZachary Stevens
 
Testing for infra code using test-kitchen,docker,chef
Testing for infra code using  test-kitchen,docker,chefTesting for infra code using  test-kitchen,docker,chef
Testing for infra code using test-kitchen,docker,chefkamalikamj
 
Test Driven Development with Chef
Test Driven Development with ChefTest Driven Development with Chef
Test Driven Development with ChefSimone Soldateschi
 

What's hot (20)

Chef Tutorial | Chef Tutorial For Beginners | DevOps Chef Tutorial | DevOps T...
Chef Tutorial | Chef Tutorial For Beginners | DevOps Chef Tutorial | DevOps T...Chef Tutorial | Chef Tutorial For Beginners | DevOps Chef Tutorial | DevOps T...
Chef Tutorial | Chef Tutorial For Beginners | DevOps Chef Tutorial | DevOps T...
 
How to Write Chef Cookbook
How to Write Chef CookbookHow to Write Chef Cookbook
How to Write Chef Cookbook
 
Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015
 
Azure handsonlab
Azure handsonlabAzure handsonlab
Azure handsonlab
 
Automated Deployments with Ansible
Automated Deployments with AnsibleAutomated Deployments with Ansible
Automated Deployments with Ansible
 
Introduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen SummitIntroduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen Summit
 
Overview of Chef - Fundamentals Webinar Series Part 1
Overview of Chef - Fundamentals Webinar Series Part 1Overview of Chef - Fundamentals Webinar Series Part 1
Overview of Chef - Fundamentals Webinar Series Part 1
 
Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...
Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...
Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...
 
Test-Driven Infrastructure with Chef
Test-Driven Infrastructure with ChefTest-Driven Infrastructure with Chef
Test-Driven Infrastructure with Chef
 
Chef-Zero & Local Mode
Chef-Zero & Local ModeChef-Zero & Local Mode
Chef-Zero & Local Mode
 
Infrastructure Automation with Chef
Infrastructure Automation with ChefInfrastructure Automation with Chef
Infrastructure Automation with Chef
 
Introduction to chef
Introduction to chefIntroduction to chef
Introduction to chef
 
The unintended benefits of Chef
The unintended benefits of ChefThe unintended benefits of Chef
The unintended benefits of Chef
 
Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...
Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...
Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...
 
AWS Meetup - Sydney - February
AWS Meetup - Sydney - February AWS Meetup - Sydney - February
AWS Meetup - Sydney - February
 
Compliance Automation Workshop
Compliance Automation WorkshopCompliance Automation Workshop
Compliance Automation Workshop
 
Server Installation and Configuration with Chef
Server Installation and Configuration with ChefServer Installation and Configuration with Chef
Server Installation and Configuration with Chef
 
CLUG 2014-10 - Cookbook CI with Jenkins
CLUG 2014-10 - Cookbook CI with JenkinsCLUG 2014-10 - Cookbook CI with Jenkins
CLUG 2014-10 - Cookbook CI with Jenkins
 
Testing for infra code using test-kitchen,docker,chef
Testing for infra code using  test-kitchen,docker,chefTesting for infra code using  test-kitchen,docker,chef
Testing for infra code using test-kitchen,docker,chef
 
Test Driven Development with Chef
Test Driven Development with ChefTest Driven Development with Chef
Test Driven Development with Chef
 

Viewers also liked

Viewers also liked (6)

Etsy chef-workflow
Etsy chef-workflowEtsy chef-workflow
Etsy chef-workflow
 
Chef Cookbook Workflow
Chef Cookbook WorkflowChef Cookbook Workflow
Chef Cookbook Workflow
 
Chef Workflow Strategies at SecondMarket
Chef Workflow Strategies at SecondMarketChef Workflow Strategies at SecondMarket
Chef Workflow Strategies at SecondMarket
 
Scaling Deployment at Etsy
Scaling Deployment at EtsyScaling Deployment at Etsy
Scaling Deployment at Etsy
 
Deploy, Collaborate and Listen
Deploy, Collaborate and ListenDeploy, Collaborate and Listen
Deploy, Collaborate and Listen
 
Internet of Things (IoT) HackDay
Internet of Things (IoT) HackDayInternet of Things (IoT) HackDay
Internet of Things (IoT) HackDay
 

Similar to Michelin Starred Cooking with Chef

Chef at WebMD
Chef at WebMDChef at WebMD
Chef at WebMDadamleff
 
Atmosphere 2014: Really large scale systems configuration - Phil Dibowitz
Atmosphere 2014: Really large scale systems configuration - Phil DibowitzAtmosphere 2014: Really large scale systems configuration - Phil Dibowitz
Atmosphere 2014: Really large scale systems configuration - Phil DibowitzPROIDEA
 
Testable Infrastructure with Chef, Test Kitchen, and Docker
Testable Infrastructure with Chef, Test Kitchen, and DockerTestable Infrastructure with Chef, Test Kitchen, and Docker
Testable Infrastructure with Chef, Test Kitchen, and DockerMandi Walls
 
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2Chef
 
Using Nagios with Chef
Using Nagios with ChefUsing Nagios with Chef
Using Nagios with ChefBryan McLellan
 
Introduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to ChefIntroduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to ChefAll Things Open
 
Testing Your Automation Code (Vagrant Version)
Testing Your Automation Code (Vagrant Version)Testing Your Automation Code (Vagrant Version)
Testing Your Automation Code (Vagrant Version)Mischa Taylor
 
Testing your-automation-code (vagrant version) v0.2
Testing your-automation-code (vagrant version) v0.2Testing your-automation-code (vagrant version) v0.2
Testing your-automation-code (vagrant version) v0.2Sylvain Tissot
 
Introduction to Chef
Introduction to ChefIntroduction to Chef
Introduction to Chefkevsmith
 
Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet Camp New York 2014: Streamlining Puppet Development Workflow Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet Camp New York 2014: Streamlining Puppet Development Workflow Puppet
 
Steamlining your puppet development workflow
Steamlining your puppet development workflowSteamlining your puppet development workflow
Steamlining your puppet development workflowTomas Doran
 
A Supermarket of Your Own: Running a Private Chef Supermarket
A Supermarket of Your Own: Running a Private Chef SupermarketA Supermarket of Your Own: Running a Private Chef Supermarket
A Supermarket of Your Own: Running a Private Chef SupermarketNell Shamrell-Harrington
 
Intro to Git and GitHub
Intro to Git and GitHubIntro to Git and GitHub
Intro to Git and GitHubUri Goldstein
 
Cook like a Chef
Cook like a ChefCook like a Chef
Cook like a ChefIan Yang
 
Continuous Integration, the minimum viable product
Continuous Integration, the minimum viable productContinuous Integration, the minimum viable product
Continuous Integration, the minimum viable productJulian Simpson
 
Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3Chef
 
.Git for WordPress Developers
.Git for WordPress Developers.Git for WordPress Developers
.Git for WordPress Developersmpvanwinkle
 
Introduction To Continuous Compliance & Remediation
Introduction To Continuous Compliance & RemediationIntroduction To Continuous Compliance & Remediation
Introduction To Continuous Compliance & RemediationNicole Johnson
 

Similar to Michelin Starred Cooking with Chef (20)

Chef at WebMD
Chef at WebMDChef at WebMD
Chef at WebMD
 
The Environment Restaurant
The Environment RestaurantThe Environment Restaurant
The Environment Restaurant
 
Atmosphere 2014: Really large scale systems configuration - Phil Dibowitz
Atmosphere 2014: Really large scale systems configuration - Phil DibowitzAtmosphere 2014: Really large scale systems configuration - Phil Dibowitz
Atmosphere 2014: Really large scale systems configuration - Phil Dibowitz
 
Testable Infrastructure with Chef, Test Kitchen, and Docker
Testable Infrastructure with Chef, Test Kitchen, and DockerTestable Infrastructure with Chef, Test Kitchen, and Docker
Testable Infrastructure with Chef, Test Kitchen, and Docker
 
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
 
Using Nagios with Chef
Using Nagios with ChefUsing Nagios with Chef
Using Nagios with Chef
 
Introduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to ChefIntroduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to Chef
 
Testing Your Automation Code (Vagrant Version)
Testing Your Automation Code (Vagrant Version)Testing Your Automation Code (Vagrant Version)
Testing Your Automation Code (Vagrant Version)
 
Testing your-automation-code (vagrant version) v0.2
Testing your-automation-code (vagrant version) v0.2Testing your-automation-code (vagrant version) v0.2
Testing your-automation-code (vagrant version) v0.2
 
Introduction to Chef
Introduction to ChefIntroduction to Chef
Introduction to Chef
 
Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet Camp New York 2014: Streamlining Puppet Development Workflow Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet Camp New York 2014: Streamlining Puppet Development Workflow
 
Steamlining your puppet development workflow
Steamlining your puppet development workflowSteamlining your puppet development workflow
Steamlining your puppet development workflow
 
A Supermarket of Your Own: Running a Private Chef Supermarket
A Supermarket of Your Own: Running a Private Chef SupermarketA Supermarket of Your Own: Running a Private Chef Supermarket
A Supermarket of Your Own: Running a Private Chef Supermarket
 
Intro to Git and GitHub
Intro to Git and GitHubIntro to Git and GitHub
Intro to Git and GitHub
 
Cook like a Chef
Cook like a ChefCook like a Chef
Cook like a Chef
 
Continuous Integration, the minimum viable product
Continuous Integration, the minimum viable productContinuous Integration, the minimum viable product
Continuous Integration, the minimum viable product
 
Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3
 
.Git for WordPress Developers
.Git for WordPress Developers.Git for WordPress Developers
.Git for WordPress Developers
 
Chef training Day4
Chef training Day4Chef training Day4
Chef training Day4
 
Introduction To Continuous Compliance & Remediation
Introduction To Continuous Compliance & RemediationIntroduction To Continuous Compliance & Remediation
Introduction To Continuous Compliance & Remediation
 

More from Jon Cowie

Building a Healthy Work Life Balance
Building a Healthy Work Life BalanceBuilding a Healthy Work Life Balance
Building a Healthy Work Life BalanceJon Cowie
 
Cheffing Etsy - Do too many cooks spoil the soup?
Cheffing Etsy - Do too many cooks spoil the soup?Cheffing Etsy - Do too many cooks spoil the soup?
Cheffing Etsy - Do too many cooks spoil the soup?Jon Cowie
 
Chef at Etsy
Chef at EtsyChef at Etsy
Chef at EtsyJon Cowie
 
Customizing Chef for Fun and Profit
Customizing Chef for Fun and ProfitCustomizing Chef for Fun and Profit
Customizing Chef for Fun and ProfitJon Cowie
 
Custom Live Media Spinning
Custom Live Media SpinningCustom Live Media Spinning
Custom Live Media SpinningJon Cowie
 
Bring the Noise
Bring the NoiseBring the Noise
Bring the NoiseJon Cowie
 

More from Jon Cowie (6)

Building a Healthy Work Life Balance
Building a Healthy Work Life BalanceBuilding a Healthy Work Life Balance
Building a Healthy Work Life Balance
 
Cheffing Etsy - Do too many cooks spoil the soup?
Cheffing Etsy - Do too many cooks spoil the soup?Cheffing Etsy - Do too many cooks spoil the soup?
Cheffing Etsy - Do too many cooks spoil the soup?
 
Chef at Etsy
Chef at EtsyChef at Etsy
Chef at Etsy
 
Customizing Chef for Fun and Profit
Customizing Chef for Fun and ProfitCustomizing Chef for Fun and Profit
Customizing Chef for Fun and Profit
 
Custom Live Media Spinning
Custom Live Media SpinningCustom Live Media Spinning
Custom Live Media Spinning
 
Bring the Noise
Bring the NoiseBring the Noise
Bring the Noise
 

Recently uploaded

The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6DianaGray10
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfDianaGray10
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaborationbruanjhuli
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7DianaGray10
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 
Introduction to Quantum Computing
Introduction to Quantum ComputingIntroduction to Quantum Computing
Introduction to Quantum ComputingGDSC PJATK
 
GenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncGenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncObject Automation
 
Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.francesco barbera
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URLRuncy Oommen
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintMahmoud Rabie
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemAsko Soukka
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
PicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer ServicePicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer ServiceRenan Moreira de Oliveira
 

Recently uploaded (20)

The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 
Introduction to Quantum Computing
Introduction to Quantum ComputingIntroduction to Quantum Computing
Introduction to Quantum Computing
 
GenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncGenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation Inc
 
Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URL
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystem
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
PicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer ServicePicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer Service
 

Michelin Starred Cooking with Chef

  • 1. Michelin Starred Cooking with Chef Jon Cowie, Etsy.com jcowie@etsy.com @jonlives
  • 4. What? • Chef at Etsy • Familiarity and Understanding
  • 5. What? • Chef at Etsy • Familiarity and Understanding • Critical Approach and Experimentation
  • 6. What? • Chef at Etsy • Familiarity and Understanding • Critical Approach and Experimentation • Use The Source
  • 7. What? • Chef at Etsy • Familiarity and Understanding • Critical Approach and Experimentation • Use The Source • A liberal sprinkling of screwups
  • 8. What? • Chef at Etsy • Familiarity and Understanding • Critical Approach and Experimentation • Use The Source • A liberal sprinkling of screwups • Open Sourced Goodness - We’re all here!
  • 9. What? • Chef at Etsy • Familiarity and Understanding • Critical Approach and Experimentation • Use The Source • A liberal sprinkling of screwups • Open Sourced Goodness - We’re all here! • [x] = http://tiny.cc/velocity2012
  • 10. Opscode is Orange, Velocity is Blue. In Soviet Russia, Cookbook writes you.
  • 13. Our Setup • Open Source chef server 0.10.4
  • 14. Our Setup • Open Source chef server 0.10.4 • Backup to Opscode Platform
  • 15. Our Setup • Open Source chef server 0.10.4 • Backup to Opscode Platform • ~800 self-hosted nodes (Mainly CentOS, some RHEL & mac)
  • 16. Our Setup • Open Source chef server 0.10.4 • Backup to Opscode Platform • ~800 self-hosted nodes (Mainly CentOS, some RHEL & mac) • KVM & lxc virts, self hosted too.
  • 17. Our Setup • Open Source chef server 0.10.4 • Backup to Opscode Platform • ~800 self-hosted nodes (Mainly CentOS, some RHEL & mac) • KVM & lxc virts, self hosted too. • Never test in production!
  • 18. Our Setup • Open Source chef server 0.10.4 • Backup to Opscode Platform • ~800 self-hosted nodes (Mainly CentOS, some RHEL & mac) • KVM & lxc virts, self hosted too. • Never test in production! • Many chefs don’t spoil our soup
  • 19. Our Setup • Open Source chef server 0.10.4 • Backup to Opscode Platform • ~800 self-hosted nodes (Mainly CentOS, some RHEL & mac) • KVM & lxc virts, self hosted too. • Never test in production! • Many chefs don’t spoil our soup
  • 27. Insight • You should never have to say “I don’t know.”
  • 28. Insight • You should never have to say “I don’t know.” • What, where, when, why, how long?
  • 29. Insight • You should never have to say “I don’t know.” • What, where, when, why, how long? • Easy, and I’ll show you how!
  • 32. Chef Dashboard • Chef handler sends metrics to graphite [4]
  • 33. Chef Dashboard • Chef handler sends metrics to graphite [4] • git clone git://github.com/etsy/chef-handlers.git
  • 34. Chef Dashboard • Chef handler sends metrics to graphite [4] • git clone git://github.com/etsy/chef-handlers.git • Set your graphite server’s URL in graphite.rb
  • 35. Chef Dashboard • Chef handler sends metrics to graphite [4] • git clone git://github.com/etsy/chef-handlers.git • Set your graphite server’s URL in graphite.rb • Add the following to client.rb
  • 36. Chef Dashboard • Chef handler sends metrics to graphite [4] • git clone git://github.com/etsy/chef-handlers.git • Set your graphite server’s URL in graphite.rb • Add the following to client.rb • require "<clonedir>/graphite.rb" graphite_handler = GraphiteReporting.new report_handlers << graphite_handler exception_handlers << graphite_handler
  • 37. Chef Dashboard • Chef handler sends metrics to graphite [4] • git clone git://github.com/etsy/chef-handlers.git • Set your graphite server’s URL in graphite.rb • Add the following to client.rb • require "<clonedir>/graphite.rb" graphite_handler = GraphiteReporting.new report_handlers << graphite_handler exception_handlers << graphite_handler • Etsy dashboards framework [5]
  • 38. [12:54:01] <irccat> Chef run failed on gfernandez.vm.ny4dev.etsy.com [12:54:02] <irccat> https://github.etsycorp.com/gist/384228 [12:54:02] <irccat> [12:54:07] <irccat> Chef run failed on buildtest11.ny4dev.etsy.com [12:54:07] <irccat> https://github.etsycorp.com/gist/384227 [12:54:07] <irccat>
  • 40. Chef irccat Alerts • Chef handler send fails to irc[4] via irccat [6]
  • 41. Chef irccat Alerts • Chef handler send fails to irc[4] via irccat [6] • git clone git://github.com/etsy/chef-handlers.git
  • 42. Chef irccat Alerts • Chef handler send fails to irc[4] via irccat [6] • git clone git://github.com/etsy/chef-handlers.git • Set your irccat[6] server’s URL in logtoirc.rb
  • 43. Chef irccat Alerts • Chef handler send fails to irc[4] via irccat [6] • git clone git://github.com/etsy/chef-handlers.git • Set your irccat[6] server’s URL in logtoirc.rb • Add the following to client.rb
  • 44. Chef irccat Alerts • Chef handler send fails to irc[4] via irccat [6] • git clone git://github.com/etsy/chef-handlers.git • Set your irccat[6] server’s URL in logtoirc.rb • Add the following to client.rb • require "<clonedir>/logtoirc.rb" exception_handlers << Etsy::LogToIRC.new
  • 45. ~ > knife node lastrun buildtest11.ny4dev.etsy.com Status failed Elapsed Time 4.628171438 Start Time 2012-06-18 10:06:28 +0000 End Time 2012-06-18 10:06:32 +0000 Recipe Action Resource Type Resource Backtrace <snip> Exception Chef::Exceptions::Package: package[php] (php::buildtest line 20) had an error: Version 5.3.10-1.el5 of php not found. Did you specify both version and release? (version-release, e.g. 1.84-10.fc6)
  • 46. ~ > knife search node 'lastrun_debug_formatted_exception:Chef: :Exceptions::Package*' -a lastrun.debug.formatted_exception 5 items found id: masterrestore.ny4.etsy.com lastrun.debug.formatted_exception: Chef::Exceptions::Package: package[postgresql-server] (postgresql::server-8.3 line 1) had an error: Installed package postgresql-server-8.3.16-1PGDG_id is newer than candidate package postgresql-server-8.3.11-1PGDG_id.rhel5 id: buildtest11.ny4dev.etsy.com lastrun.debug.formatted_exception: Chef::Exceptions::Package: package[php] (php::buildtest line 20) had an error: Version 5.3.10-1.el5 of php not found. Did you specify both version and release? (version-release, e.g. 1.84-10.fc6) <snip>
  • 48. Chef lastrun Info • Chef handler and knife plugin [7]
  • 49. Chef lastrun Info • Chef handler and knife plugin [7] • gem install knife-lastrun
  • 50. Chef lastrun Info • Chef handler and knife plugin [7] • gem install knife-lastrun • Add the following to client.rb
  • 51. Chef lastrun Info • Chef handler and knife plugin [7] • gem install knife-lastrun • Add the following to client.rb • require "lastrun_update" handler = LastRunUpdateHandler.new report_handlers << handler exception_handlers << handler
  • 52. Chef lastrun Info • Chef handler and knife plugin [7] • gem install knife-lastrun • Add the following to client.rb • require "lastrun_update" handler = LastRunUpdateHandler.new report_handlers << handler exception_handlers << handler • knife node lastrun <nodename>
  • 54. Simplicity • Think of yourself at 3AM!
  • 55. Simplicity • Think of yourself at 3AM! • Please, won’t you think of the new guy?
  • 56. Simplicity • Think of yourself at 3AM! • Please, won’t you think of the new guy? • Minimize the logics!
  • 57. Simplicity • Think of yourself at 3AM! • Please, won’t you think of the new guy? • Minimize the logics! • As few logical steps from start to finish as possible.
  • 58. Simplicity - Not! Date: Mon Dec 05 2011 23:07:18 GMT+0000 (GMT) Subject: so close to death # Don't install v2 on search or Cent 5.6 nodes -if node[:fqdn] !~ /b(^(preprod-)?search[0-9]{2}|ny4dev.etsy.com|^(preprod-)? giftsweb[0-9]{2}|^db(shard|spare|data)[0-9]{2}|^qa-web01|^devsearch[0-9]{2}|^nagios01| ^webnest[0-9]{2}|^prodking[0-9]{2}|^sandboxweb[0-9]{2}|^virt((0[5-9])|(1[0-9]))| ^msysmgr[0-9]{2}|^msysmta[0-9]{2}|^dbconvo[0-9]{2}|^dbshowcase01|atlasweb[0-9]{2}| devnagios[0-9]{2}|cimaster02|worker[0-9]{2}|^ganglia[0-9]{2}|^imgcache[0-9]{2}| imgconvert[0-9]{2}|^imgwriter[0-9]{2}|dev-img02|^datacache04|^graphite01|^graphite03| ^webutil03|^webutil04|^statsd01|^maintweb[0-9]{2}|^(dev-|preprod-)?convosearch[0-9]{2}| deployinator[0-9]{2}|^wpadmin01|^(preprod-)?dbtasks[0-9]{2})b/ and node.role?("Web56") == false and node.role?("Preprodweb56") == false and node.role?("Princess53") == false +if node[:fqdn] !~ /b(^(preprod-)?search[0-9]{2}|ny4dev.etsy.com|^(preprod-)? giftsweb[0-9]{2}|^db(shard|spare|data)[0-9]{2}|^qa-web01|^devsearch[0-9]{2}|^nagios01| ^webnest[0-9]{2}|^prodking[0-9]{2}|^sandboxweb[0-9]{2}|^virt((0[5-9])|(1[0-9]))| ^msysmgr[0-9]{2}|^msysmta[0-9]{2}|^dbconvo[0-9]{2}|^dbshowcase01|atlasweb[0-9]{2}| devnagios[0-9]{2}|cimaster02|worker[0-9]{2}|^ganglia[0-9]{2}|^imgcache[0-9]{2}| imgconvert[0-9]{2}|^imgwriter[0-9]{2}|dev-img02|^datacache04|^graphite01|^graphite03| ^webutil03|^webutil04|^statsd01|^maintweb[0-9]{2}|^(dev-|preprod-)?convosearch[0-9]{2}| deployinator[0-9]{2}|^wpadmin01|^(preprod-)?dbtasks[0-9]{2})b/ and node.role?("Web56") == false and node.role?("Preprodweb56") == false and node.role?("Princess53") == false and node.role?("Auth") == false
  • 59. Simplicity - Better! if node.chef_environment == "libmemcached_upgrade" package "libmemcached" do version "1.0.4-1" action :install end <snip> else package "libmemcached" do version "0.53-1.1" action :install end <snip> end
  • 61. Simplicity - Complexity • Sometimes you need complex behaviour
  • 62. Simplicity - Complexity • Sometimes you need complex behaviour • Don’t fight it, try to abstract it.
  • 63. Simplicity - Complexity • Sometimes you need complex behaviour • Don’t fight it, try to abstract it. • Case in point: Syslog-ng refactor
  • 66. Case Study: Syslog-ng • 36 recipes • 30 versions of syslog-ng.conf
  • 67. Case Study: Syslog-ng • 36 recipes • 30 versions of syslog-ng.conf • 27 manually configured files in /etc/syslog- ng.d on central server
  • 68. Case Study: Syslog-ng • 36 recipes • 30 versions of syslog-ng.conf • 27 manually configured files in /etc/syslog- ng.d on central server • Edge cases and exceptions galore
  • 71. Case Study: Syslog-ng • Down to: • 2 recipes (one client, one server)
  • 72. Case Study: Syslog-ng • Down to: • 2 recipes (one client, one server) • 2 templates (one for syslog-ng.conf, one for stuff in /etc/syslog-ng.d)
  • 73. Case Study: Syslog-ng • Down to: • 2 recipes (one client, one server) • 2 templates (one for syslog-ng.conf, one for stuff in /etc/syslog-ng.d) • Attributes in roles
  • 74. Case Study: Syslog-ng • Down to: • 2 recipes (one client, one server) • 2 templates (one for syslog-ng.conf, one for stuff in /etc/syslog-ng.d) • Attributes in roles • Not open sourced yet, sorry :(
  • 75. Case Study: Syslog-ng "syslog": { "group": "preprod_web", "items": { "web_apache_access_log": { "source": "/var/log/httpd/access_log", "source_program_override": "APACHEACCESS: ", "destination": "<snip>/access.log", "destination_filters": [ "host('^preprod-web')", "match('APACHEACCESS')" ], "destination_options": [ "template_escape(no)" ] }, } }
  • 76. Remember, No Panacea!
  • 77. Remember, No Panacea! • A new package hits the repo.
  • 78. Remember, No Panacea! • A new package hits the repo. • Are you in control of when it goes out?
  • 79. Remember, No Panacea! • A new package hits the repo. • Are you in control of when it goes out? • Memcached Outage
  • 80. Remember, No Panacea! • A new package hits the repo. • Are you in control of when it goes out? • Memcached Outage • Do you know what services are going to restart and when?
  • 81. Remember, No Panacea! • A new package hits the repo. • Are you in control of when it goes out? • Memcached Outage • Do you know what services are going to restart and when? • Image Service Outage
  • 83. Standards • Not going to talk about testing [8]!
  • 84. Standards • Not going to talk about testing [8]! • But I don’t have time for standards!
  • 85. Standards - No Time!
  • 86. Standards - No Time! • I won’t say “Make Time”, but you should...
  • 87. Standards - No Time! • I won’t say “Make Time”, but you should... • For a quick win, try Foodcritic
  • 88. Standards - No Time! • I won’t say “Make Time”, but you should... • For a quick win, try Foodcritic • Good out of the box rules
  • 89. Standards - No Time! • I won’t say “Make Time”, but you should... • For a quick win, try Foodcritic • Good out of the box rules • Jenkins integration in seconds
  • 90. Standards - No Time! • I won’t say “Make Time”, but you should... • For a quick win, try Foodcritic • Good out of the box rules • Jenkins integration in seconds • Supports custom rules
  • 91. Standards - No Time! • I won’t say “Make Time”, but you should... • For a quick win, try Foodcritic • Good out of the box rules • Jenkins integration in seconds • Supports custom rules • Plays well with others
  • 95. Foodcritic •gem install foodcritic •foodcritic <cookbook_repo> •Simple Jenkins job:
  • 96. Foodcritic •gem install foodcritic •foodcritic <cookbook_repo> •Simple Jenkins job: #!/usr/bin/env rvm-shell 1.9.3 foodcritic -f correctness .
  • 98. Standards at Etsy • “style” not “correctness”[9]
  • 99. Standards at Etsy • “style” not “correctness”[9] • ETSY001 - Package or yum_package resource used with :upgrade action
  • 100. Standards at Etsy • “style” not “correctness”[9] • ETSY001 - Package or yum_package resource used with :upgrade action • ETSY002 - Execute resource used to run git commands
  • 101. Standards at Etsy • “style” not “correctness”[9] • ETSY001 - Package or yum_package resource used with :upgrade action • ETSY002 - Execute resource used to run git commands • ETSY003 - Execute resource used to run curl or wget commands
  • 102. Standards at Etsy • “style” not “correctness”[9] • ETSY001 - Package or yum_package resource used with :upgrade action • ETSY002 - Execute resource used to run git commands • ETSY003 - Execute resource used to run curl or wget commands • ETSY004 - Execute resource defined without conditional or action :nothing
  • 103. Standards at Etsy • “style” not “correctness”[9] • ETSY001 - Package or yum_package resource used with :upgrade action • ETSY002 - Execute resource used to run git commands • ETSY003 - Execute resource used to run curl or wget commands • ETSY004 - Execute resource defined without conditional or action :nothing • ETSY005 - Action :restart sent to a core service
  • 104. Standards at Etsy • “style” not “correctness”[9] • ETSY001 - Package or yum_package resource used with :upgrade action • ETSY002 - Execute resource used to run git commands • ETSY003 - Execute resource used to run curl or wget commands • ETSY004 - Execute resource defined without conditional or action :nothing • ETSY005 - Action :restart sent to a core service • ETSY006 - Execute resource used to run chef-provided command
  • 105. Standards at Etsy • “style” not “correctness”[9] • ETSY001 - Package or yum_package resource used with :upgrade action • ETSY002 - Execute resource used to run git commands • ETSY003 - Execute resource used to run curl or wget commands • ETSY004 - Execute resource defined without conditional or action :nothing • ETSY005 - Action :restart sent to a core service • ETSY006 - Execute resource used to run chef-provided command • ETSY007 - Package or yum_package resource used to install core package without specific version number
  • 106. Standards at Etsy • “style” not “correctness”[9] • ETSY001 - Package or yum_package resource used with :upgrade action • ETSY002 - Execute resource used to run git commands • ETSY003 - Execute resource used to run curl or wget commands • ETSY004 - Execute resource defined without conditional or action :nothing • ETSY005 - Action :restart sent to a core service • ETSY006 - Execute resource used to run chef-provided command • ETSY007 - Package or yum_package resource used to install core package without specific version number
  • 108. Standards at Etsy • ETSY001 - Written after Memcached Outage
  • 109. Standards at Etsy • ETSY001 - Written after Memcached Outage • Package or yum_package resource used with :upgrade action
  • 110. Standards at Etsy • ETSY001 - Written after Memcached Outage • Package or yum_package resource used with :upgrade action • package "memcached" do action :upgrade end
  • 112. Standards at Etsy • ETSY005 - Written after a total Image service outage
  • 113. Standards at Etsy • ETSY005 - Written after a total Image service outage • Action :restart sent to a core service
  • 114. Standards at Etsy • ETSY005 - Written after a total Image service outage • Action :restart sent to a core service • cookbook_file "/etc/httpd/conf.d/myvhost.conf" do source "myvhost.conf" notifies :restart, resources(:service => "httpd") end
  • 115. Critical Approach and Experimentation
  • 116. CA&E
  • 117. CA&E • Chef is by necessity generic
  • 118. CA&E • Chef is by necessity generic • ...so don’t take Opscode’s word for it.
  • 119. CA&E • Chef is by necessity generic • ...so don’t take Opscode’s word for it. • If it doesn’t work well for you, change it!
  • 120. CA&E • Chef is by necessity generic • ...so don’t take Opscode’s word for it. • If it doesn’t work well for you, change it! • Case Study - Etsy Environments rollout
  • 122. Environments Rollout • We knew we needed them
  • 123. Environments Rollout • We knew we needed them • Simple enough, right?
  • 124. Environments Rollout • We knew we needed them • Simple enough, right? • Let’s look at the workflow...
  • 126. Env: Standard Workflow • knife cookbook show php
  • 127. Env: Standard Workflow • knife cookbook show php • Change version number in metadata.rb
  • 128. Env: Standard Workflow • knife cookbook show php • Change version number in metadata.rb • Change version constraint in foo.json
  • 129. Env: Standard Workflow • knife cookbook show php • Change version number in metadata.rb • Change version constraint in foo.json • Commit and push changes to git
  • 130. Env: Standard Workflow • knife cookbook show php • Change version number in metadata.rb • Change version constraint in foo.json • Commit and push changes to git • knife cookbook upload php --freeze
  • 131. Env: Standard Workflow • knife cookbook show php • Change version number in metadata.rb • Change version constraint in foo.json • Commit and push changes to git • knife cookbook upload php --freeze • knife environment from file foo.json
  • 133. Env: Our Issues • 41 people with Chef repo access
  • 134. Env: Our Issues • 41 people with Chef repo access • Most with knife keys
  • 135. Env: Our Issues • 41 people with Chef repo access • Most with knife keys • All editing the same 2 files with every change...
  • 137. Env: Solutions? • Go with it and hope for the best?
  • 138. Env: Solutions? • Go with it and hope for the best? • Don’t use environments?
  • 139. Env: Solutions? • Go with it and hope for the best? • Don’t use environments? • Write a totally new workflow?
  • 140. Env: Solutions? • Go with it and hope for the best? • Don’t use environments? • Write a totally new workflow? • Tweak the existing one with some tooling?
  • 142. Env: Solution! • Tweak with some tooling!
  • 143. Env: Solution! • Tweak with some tooling! • Presenting knife-spork [10]...
  • 145. Spork: Workflow • Wrapper around standard environments workflow
  • 146. Spork: Workflow • Wrapper around standard environments workflow • check - cookbook versioning
  • 147. Spork: Workflow • Wrapper around standard environments workflow • check - cookbook versioning • bump - increment version component
  • 148. Spork: Workflow • Wrapper around standard environments workflow • check - cookbook versioning • bump - increment version component • upload - upload and freeze
  • 149. Spork: Workflow • Wrapper around standard environments workflow • check - cookbook versioning • bump - increment version component • upload - upload and freeze • promote - set env constraints
  • 150. Spork: Check $> knife spork check apache2 Checking versions for cookbook apache2... Current local version: 1.0.6 Remote versions (Max. 5 most recent only): *1.0.6, frozen 1.0.5, frozen <snip> DANGER: Your local cookbook has same version number as the starred version above! Please bump your local version or you won't be able to upload.
  • 151. Spork: Bump $> knife spork bump apache2 <major|minor|patch|manual> Bumping patch level of the apache2 cookbook from 1.0.6 to 1.0.7
  • 152. Spork: Upload $> knife spork upload apache2 Uploading and freezing apache2 [1.0.7] upload complete
  • 153. Spork: Promote $> knife spork promote foo php Adding version constraint php = 1.0.6 Saving changes into foo.json Promotion complete! Please remember to upload your changed Environment file to the Chef Server. --- $> knife spork promote foo php --remote Adding version constraint php = 0.1.0 Saving changes into foo.json Uploading foo to server
  • 154. Spork
  • 155. Spork • Worked well, avoided the issues it was designed for
  • 156. Spork • Worked well, avoided the issues it was designed for • Subsequently evolved
  • 157. Spork • Worked well, avoided the issues it was designed for • Subsequently evolved • A lot of input & work came from Devs
  • 158. Spork • Worked well, avoided the issues it was designed for • Subsequently evolved • A lot of input & work came from Devs • Organic evolution
  • 159. Spork • Worked well, avoided the issues it was designed for • Subsequently evolved • A lot of input & work came from Devs • Organic evolution • Open sourced, of course
  • 162. Spork: Evolution • Safety Checks • Extra Features
  • 164. Spork: Safety Checks • Before promoting, check version is uploaded...
  • 165. Spork: Safety Checks $> knife spork promote php --remote <snip> WARNING: It looks like you have multiple cookbook paths defined so I can't tell if you're running inside a git repo. Checking that php version 0.1.93 exists on the server before promoting (any error means it hasn't been uploaded yet)... ERROR: The object you are looking for could not be found Response: Cannot find a cookbook named php with version 0.1.93
  • 166. Spork: Safety Checks • Before promoting, check version is uploaded... • Check if you’re promoting changes to more than you thought....
  • 167. Spork: Safety Checks WARNING: You're about to promote changes to several cookbooks: WARNING: ganglia: = 0.1.26 changed to = 0.1.25 installerz: = 0.1.66 changed to = 0.1.65 php: = 0.1.92 changed to = 0.1.93 Are you sure you want to continue? (Y/N) N You said no, so I'm done here. Would you like to reset your local development.json to match the server?? (Y/N) Y <snip> development.json reset.
  • 170. Spork: Features • Default Environments • Git support
  • 171. Spork: Features • Default Environments • Git support • Chat notifications + Gist (upload and promote)
  • 172. Spork: Features • Default Environments • Git support • Chat notifications + Gist (upload and promote) • IRCCat
  • 173. Spork: Features • Default Environments • Git support • Chat notifications + Gist (upload and promote) • IRCCat • Hipchat (courtesy of Secondmarket)
  • 174. Features: Chat Notifications [19:43:46] <irccat> CHEF: pmcdonnell uploaded and froze cookbook immount version 0.0.24 [19:44:00] <irccat> CHEF: pmcdonnell uploaded environment production https://github.etsycorp.com/gist/385043 [19:44:01] <irccat> CHEF: pmcdonnell uploaded environment development https://github.etsycorp.com/gist/385044
  • 175. Spork: Features • Default Environments • Git support • Chat notifications + Gist (upload and promote) • IRCCat • Hipchat (courtesy of Secondmarket) • Graphite (on promote)
  • 177. Spork: Features • Default Environments • Git support • Chat notifications + Gist (upload and promote) • IRCCat • Hipchat (courtesy of Secondmarket) • Graphite (on promote) • Foodcritic (on upload)
  • 178. Features: Foodcritic $> knife spork upload system <snip> Lint checking system... ERROR: Lint check failed. Halting upload. ERROR: Lint check output: ERROR: ETSY003: Execute resource used to run curl or wget commands: /Users/jcowie/dev/etsy/chef/cookbooks/ system/recipes/dev-ssl.rb:41
  • 180. We’re hiring! BoF on Tuesday or just come and say Hi :)

Editor's Notes

  1. \n
  2. \n\n
  3. \n\n
  4. \n\n
  5. \n\n
  6. \n\n
  7. \n\n
  8. \n\n
  9. \nTHERE IS NO PANACEA. You&amp;#x2019;ll go mad if you go looking for one.\n
  10. \n
  11. \nWe prefer bare metal for user facing stuff, but we do use &amp;#x201C;the cloud&amp;#x201D; when the shoe fits\n
  12. \nWe prefer bare metal for user facing stuff, but we do use &amp;#x201C;the cloud&amp;#x201D; when the shoe fits\n
  13. \nWe prefer bare metal for user facing stuff, but we do use &amp;#x201C;the cloud&amp;#x201D; when the shoe fits\n
  14. \nWe prefer bare metal for user facing stuff, but we do use &amp;#x201C;the cloud&amp;#x201D; when the shoe fits\n
  15. \nWe prefer bare metal for user facing stuff, but we do use &amp;#x201C;the cloud&amp;#x201D; when the shoe fits\n
  16. \nWe prefer bare metal for user facing stuff, but we do use &amp;#x201C;the cloud&amp;#x201D; when the shoe fits\n
  17. \nWe prefer bare metal for user facing stuff, but we do use &amp;#x201C;the cloud&amp;#x201D; when the shoe fits\n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. METRIC: defaults to chef.runs.hostname.&lt;metric&gt;, totally configurable\n\nWORKS WITH OPSCODE PLATFORM!\n
  28. METRIC: defaults to chef.runs.hostname.&lt;metric&gt;, totally configurable\n\nWORKS WITH OPSCODE PLATFORM!\n
  29. METRIC: defaults to chef.runs.hostname.&lt;metric&gt;, totally configurable\n\nWORKS WITH OPSCODE PLATFORM!\n
  30. METRIC: defaults to chef.runs.hostname.&lt;metric&gt;, totally configurable\n\nWORKS WITH OPSCODE PLATFORM!\n
  31. METRIC: defaults to chef.runs.hostname.&lt;metric&gt;, totally configurable\n\nWORKS WITH OPSCODE PLATFORM!\n
  32. METRIC: defaults to chef.runs.hostname.&lt;metric&gt;, totally configurable\n\nWORKS WITH OPSCODE PLATFORM!\n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n\n
  42. \n\n
  43. \n\n
  44. \n\n
  45. \n\n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. Filter name clashes\n
  56. Filter name clashes\n
  57. Filter name clashes\n
  58. Filter name clashes\n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n