Michelin Starred Cooking with Chef Jon Cowie, Etsy.com - - PowerPoint PPT Presentation

michelin starred cooking with chef
SMART_READER_LITE
LIVE PREVIEW

Michelin Starred Cooking with Chef Jon Cowie, Etsy.com - - PowerPoint PPT Presentation

Michelin Starred Cooking with Chef Jon Cowie, Etsy.com jcowie@etsy.com @jonlives Wednesday, June 27, 12 What? Wednesday, June 27, 12 What? Chef at Etsy Wednesday, June 27, 12 What? Chef at Etsy Familiarity and Understanding


slide-1
SLIDE 1

Michelin Starred Cooking with Chef

Jon Cowie, Etsy.com

jcowie@etsy.com @jonlives

Wednesday, June 27, 12

slide-2
SLIDE 2

What?

Wednesday, June 27, 12

slide-3
SLIDE 3

What?

  • Chef at Etsy

Wednesday, June 27, 12

slide-4
SLIDE 4

What?

  • Chef at Etsy
  • Familiarity and Understanding

Wednesday, June 27, 12

slide-5
SLIDE 5

What?

  • Chef at Etsy
  • Familiarity and Understanding
  • Critical Approach and Experimentation

Wednesday, June 27, 12

slide-6
SLIDE 6

What?

  • Chef at Etsy
  • Familiarity and Understanding
  • Critical Approach and Experimentation
  • Use The Source

Wednesday, June 27, 12

slide-7
SLIDE 7

What?

  • Chef at Etsy
  • Familiarity and Understanding
  • Critical Approach and Experimentation
  • Use The Source
  • A liberal sprinkling of screwups

Wednesday, June 27, 12

slide-8
SLIDE 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!

Wednesday, June 27, 12

slide-9
SLIDE 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

Wednesday, June 27, 12

slide-10
SLIDE 10

Opscode is Orange, Velocity is Blue. In Soviet Russia, Cookbook writes you.

Wednesday, June 27, 12

slide-11
SLIDE 11

Chef at Etsy

Wednesday, June 27, 12

slide-12
SLIDE 12

Our Setup

Wednesday, June 27, 12

slide-13
SLIDE 13

Our Setup

  • Open Source chef server 0.10.4

Wednesday, June 27, 12

slide-14
SLIDE 14

Our Setup

  • Open Source chef server 0.10.4
  • Backup to Opscode Platform

Wednesday, June 27, 12

slide-15
SLIDE 15

Our Setup

  • Open Source chef server 0.10.4
  • Backup to Opscode Platform
  • ~800 self-hosted nodes (Mainly CentOS,

some RHEL & mac)

Wednesday, June 27, 12

slide-16
SLIDE 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.

Wednesday, June 27, 12

slide-17
SLIDE 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!

Wednesday, June 27, 12

slide-18
SLIDE 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

Wednesday, June 27, 12

slide-19
SLIDE 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

Wednesday, June 27, 12

slide-20
SLIDE 20

Familiarity and Understanding

Wednesday, June 27, 12

slide-21
SLIDE 21

not

http://www.flickr.com/photos/photo_secessionist/5555167113/ (C) Alexander McQueen

Wednesday, June 27, 12

slide-22
SLIDE 22

Wednesday, June 27, 12

slide-23
SLIDE 23
  • Insight

Wednesday, June 27, 12

slide-24
SLIDE 24
  • Insight
  • Simplicity

Wednesday, June 27, 12

slide-25
SLIDE 25
  • Insight
  • Simplicity
  • Standards

Wednesday, June 27, 12

slide-26
SLIDE 26

Insight

Wednesday, June 27, 12

slide-27
SLIDE 27

Insight

  • You should never have to say “I don’t

know.”

Wednesday, June 27, 12

slide-28
SLIDE 28

Insight

  • You should never have to say “I don’t

know.”

  • What, where, when, why, how long?

Wednesday, June 27, 12

slide-29
SLIDE 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!

Wednesday, June 27, 12

slide-30
SLIDE 30

Wednesday, June 27, 12

slide-31
SLIDE 31

Chef Dashboard

Wednesday, June 27, 12

slide-32
SLIDE 32

Chef Dashboard

  • Chef handler sends metrics to graphite [4]

Wednesday, June 27, 12

slide-33
SLIDE 33

Chef Dashboard

  • Chef handler sends metrics to graphite [4]
  • git clone git://github.com/etsy/chef-handlers.git

Wednesday, June 27, 12

slide-34
SLIDE 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

Wednesday, June 27, 12

slide-35
SLIDE 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

Wednesday, June 27, 12

slide-36
SLIDE 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

Wednesday, June 27, 12

slide-37
SLIDE 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]

Wednesday, June 27, 12

slide-38
SLIDE 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>

Wednesday, June 27, 12

slide-39
SLIDE 39

Chef irccat Alerts

Wednesday, June 27, 12

slide-40
SLIDE 40

Chef irccat Alerts

  • Chef handler send fails to irc[4] via irccat [6]

Wednesday, June 27, 12

slide-41
SLIDE 41

Chef irccat Alerts

  • Chef handler send fails to irc[4] via irccat [6]
  • git clone git://github.com/etsy/chef-handlers.git

Wednesday, June 27, 12

slide-42
SLIDE 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

Wednesday, June 27, 12

slide-43
SLIDE 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

Wednesday, June 27, 12

slide-44
SLIDE 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

Wednesday, June 27, 12

slide-45
SLIDE 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)

Wednesday, June 27, 12

slide-46
SLIDE 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>

Wednesday, June 27, 12

slide-47
SLIDE 47

Chef lastrun Info

Wednesday, June 27, 12

slide-48
SLIDE 48

Chef lastrun Info

  • Chef handler and knife plugin [7]

Wednesday, June 27, 12

slide-49
SLIDE 49

Chef lastrun Info

  • Chef handler and knife plugin [7]
  • gem install knife-lastrun

Wednesday, June 27, 12

slide-50
SLIDE 50

Chef lastrun Info

  • Chef handler and knife plugin [7]
  • gem install knife-lastrun
  • Add the following to client.rb

Wednesday, June 27, 12

slide-51
SLIDE 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

Wednesday, June 27, 12

slide-52
SLIDE 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>

Wednesday, June 27, 12

slide-53
SLIDE 53

Simplicity

Wednesday, June 27, 12

slide-54
SLIDE 54

Simplicity

  • Think of yourself at 3AM!

Wednesday, June 27, 12

slide-55
SLIDE 55

Simplicity

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

Wednesday, June 27, 12

slide-56
SLIDE 56

Simplicity

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

Wednesday, June 27, 12

slide-57
SLIDE 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.

Wednesday, June 27, 12

slide-58
SLIDE 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

Wednesday, June 27, 12

slide-59
SLIDE 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

Wednesday, June 27, 12

slide-60
SLIDE 60

Simplicity - Complexity

Wednesday, June 27, 12

slide-61
SLIDE 61

Simplicity - Complexity

  • Sometimes you need complex behaviour

Wednesday, June 27, 12

slide-62
SLIDE 62

Simplicity - Complexity

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

Wednesday, June 27, 12

slide-63
SLIDE 63

Simplicity - Complexity

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

Wednesday, June 27, 12

slide-64
SLIDE 64

Case Study: Syslog-ng

Wednesday, June 27, 12

slide-65
SLIDE 65

Case Study: Syslog-ng

  • 36 recipes

Wednesday, June 27, 12

slide-66
SLIDE 66

Case Study: Syslog-ng

  • 36 recipes
  • 30 versions of syslog-ng.conf

Wednesday, June 27, 12

slide-67
SLIDE 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

Wednesday, June 27, 12

slide-68
SLIDE 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

Wednesday, June 27, 12

slide-69
SLIDE 69

Case Study: Syslog-ng

Wednesday, June 27, 12

slide-70
SLIDE 70

Case Study: Syslog-ng

  • Down to:

Wednesday, June 27, 12

slide-71
SLIDE 71

Case Study: Syslog-ng

  • Down to:
  • 2 recipes (one client, one server)

Wednesday, June 27, 12

slide-72
SLIDE 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)

Wednesday, June 27, 12

slide-73
SLIDE 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

Wednesday, June 27, 12

slide-74
SLIDE 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 :(

Wednesday, June 27, 12

slide-75
SLIDE 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)" ] }, } }

Wednesday, June 27, 12

slide-76
SLIDE 76

Remember, No Panacea!

Wednesday, June 27, 12

slide-77
SLIDE 77

Remember, No Panacea!

  • A new package hits the repo.

Wednesday, June 27, 12

slide-78
SLIDE 78

Remember, No Panacea!

  • A new package hits the repo.
  • Are you in control of when it goes out?

Wednesday, June 27, 12

slide-79
SLIDE 79

Remember, No Panacea!

  • A new package hits the repo.
  • Are you in control of when it goes out?
  • Memcached Outage

Wednesday, June 27, 12

slide-80
SLIDE 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?

Wednesday, June 27, 12

slide-81
SLIDE 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

Wednesday, June 27, 12

slide-82
SLIDE 82

Standards

Wednesday, June 27, 12

slide-83
SLIDE 83

Standards

  • Not going to talk about testing [8]!

Wednesday, June 27, 12

slide-84
SLIDE 84

Standards

  • Not going to talk about testing [8]!
  • But I don’t have time for standards!

Wednesday, June 27, 12

slide-85
SLIDE 85

Standards - No Time!

Wednesday, June 27, 12

slide-86
SLIDE 86

Standards - No Time!

  • I won’t say “Make Time”, but you should...

Wednesday, June 27, 12

slide-87
SLIDE 87

Standards - No Time!

  • I won’t say “Make Time”, but you should...
  • For a quick win, try Foodcritic

Wednesday, June 27, 12

slide-88
SLIDE 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

Wednesday, June 27, 12

slide-89
SLIDE 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

Wednesday, June 27, 12

slide-90
SLIDE 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

Wednesday, June 27, 12

slide-91
SLIDE 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

Wednesday, June 27, 12

slide-92
SLIDE 92

Foodcritic

Wednesday, June 27, 12

slide-93
SLIDE 93

Foodcritic

  • gem install foodcritic

Wednesday, June 27, 12

slide-94
SLIDE 94

Foodcritic

  • gem install foodcritic
  • foodcritic <cookbook_repo>

Wednesday, June 27, 12

slide-95
SLIDE 95

Foodcritic

  • gem install foodcritic
  • foodcritic <cookbook_repo>
  • Simple Jenkins job:

Wednesday, June 27, 12

slide-96
SLIDE 96

Foodcritic

  • gem install foodcritic
  • foodcritic <cookbook_repo>
  • Simple Jenkins job:

#!/usr/bin/env rvm-shell 1.9.3 foodcritic -f correctness .

Wednesday, June 27, 12

slide-97
SLIDE 97

Standards at Etsy

Wednesday, June 27, 12

slide-98
SLIDE 98

Standards at Etsy

  • “style” not “correctness”[9]

Wednesday, June 27, 12

slide-99
SLIDE 99

Standards at Etsy

  • “style” not “correctness”[9]
  • ETSY001 - Package or yum_package resource used with :upgrade action

Wednesday, June 27, 12

slide-100
SLIDE 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

Wednesday, June 27, 12

slide-101
SLIDE 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

Wednesday, June 27, 12

slide-102
SLIDE 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

Wednesday, June 27, 12

slide-103
SLIDE 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

Wednesday, June 27, 12

slide-104
SLIDE 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

Wednesday, June 27, 12

slide-105
SLIDE 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

Wednesday, June 27, 12

slide-106
SLIDE 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

Wednesday, June 27, 12

slide-107
SLIDE 107

Standards at Etsy

Wednesday, June 27, 12

slide-108
SLIDE 108

Standards at Etsy

  • ETSY001 - Written after Memcached

Outage

Wednesday, June 27, 12

slide-109
SLIDE 109

Standards at Etsy

  • ETSY001 - Written after Memcached

Outage

  • Package or yum_package resource used

with :upgrade action

Wednesday, June 27, 12

slide-110
SLIDE 110

Standards at Etsy

  • ETSY001 - Written after Memcached

Outage

  • Package or yum_package resource used

with :upgrade action

  • package "memcached" do

action :upgrade end

Wednesday, June 27, 12

slide-111
SLIDE 111

Standards at Etsy

Wednesday, June 27, 12

slide-112
SLIDE 112

Standards at Etsy

  • ETSY005 - Written after a total Image

service outage

Wednesday, June 27, 12

slide-113
SLIDE 113

Standards at Etsy

  • ETSY005 - Written after a total Image

service outage

  • Action :restart sent to a core service

Wednesday, June 27, 12

slide-114
SLIDE 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

Wednesday, June 27, 12

slide-115
SLIDE 115

Critical Approach and Experimentation

Wednesday, June 27, 12

slide-116
SLIDE 116

CA&E

Wednesday, June 27, 12

slide-117
SLIDE 117

CA&E

  • Chef is by necessity generic

Wednesday, June 27, 12

slide-118
SLIDE 118

CA&E

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

Wednesday, June 27, 12

slide-119
SLIDE 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!

Wednesday, June 27, 12

slide-120
SLIDE 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

Wednesday, June 27, 12

slide-121
SLIDE 121

Environments Rollout

Wednesday, June 27, 12

slide-122
SLIDE 122

Environments Rollout

  • We knew we needed them

Wednesday, June 27, 12

slide-123
SLIDE 123

Environments Rollout

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

Wednesday, June 27, 12

slide-124
SLIDE 124

Environments Rollout

  • We knew we needed them
  • Simple enough, right?
  • Let’s look at the workflow...

Wednesday, June 27, 12

slide-125
SLIDE 125

Env: Standard Workflow

Wednesday, June 27, 12

slide-126
SLIDE 126

Env: Standard Workflow

  • knife cookbook show php

Wednesday, June 27, 12

slide-127
SLIDE 127

Env: Standard Workflow

  • knife cookbook show php
  • Change version number in metadata.rb

Wednesday, June 27, 12

slide-128
SLIDE 128

Env: Standard Workflow

  • knife cookbook show php
  • Change version number in metadata.rb
  • Change version constraint in foo.json

Wednesday, June 27, 12

slide-129
SLIDE 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

Wednesday, June 27, 12

slide-130
SLIDE 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

Wednesday, June 27, 12

slide-131
SLIDE 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

Wednesday, June 27, 12

slide-132
SLIDE 132

Env: Our Issues

Wednesday, June 27, 12

slide-133
SLIDE 133

Env: Our Issues

  • 41 people with Chef repo access

Wednesday, June 27, 12

slide-134
SLIDE 134

Env: Our Issues

  • 41 people with Chef repo access
  • Most with knife keys

Wednesday, June 27, 12

slide-135
SLIDE 135

Env: Our Issues

  • 41 people with Chef repo access
  • Most with knife keys
  • All editing the same 2 files with every

change...

Wednesday, June 27, 12

slide-136
SLIDE 136

Env: Solutions?

Wednesday, June 27, 12

slide-137
SLIDE 137

Env: Solutions?

  • Go with it and hope for the best?

Wednesday, June 27, 12

slide-138
SLIDE 138

Env: Solutions?

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

Wednesday, June 27, 12

slide-139
SLIDE 139

Env: Solutions?

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

Wednesday, June 27, 12

slide-140
SLIDE 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?

Wednesday, June 27, 12

slide-141
SLIDE 141

Env: Solution!

Wednesday, June 27, 12

slide-142
SLIDE 142

Env: Solution!

  • Tweak with some tooling!

Wednesday, June 27, 12

slide-143
SLIDE 143

Env: Solution!

  • Tweak with some tooling!
  • Presenting knife-spork [9]...

Wednesday, June 27, 12

slide-144
SLIDE 144

Spork: Workflow

Wednesday, June 27, 12

slide-145
SLIDE 145

Spork: Workflow

  • Wrapper around standard environments

workflow

Wednesday, June 27, 12

slide-146
SLIDE 146

Spork: Workflow

  • Wrapper around standard environments

workflow

  • check - cookbook versioning

Wednesday, June 27, 12

slide-147
SLIDE 147

Spork: Workflow

  • Wrapper around standard environments

workflow

  • check - cookbook versioning
  • bump - increment version component

Wednesday, June 27, 12

slide-148
SLIDE 148

Spork: Workflow

  • Wrapper around standard environments

workflow

  • check - cookbook versioning
  • bump - increment version component
  • upload - upload and freeze

Wednesday, June 27, 12

slide-149
SLIDE 149

Spork: Workflow

  • Wrapper around standard environments

workflow

  • check - cookbook versioning
  • bump - increment version component
  • upload - upload and freeze
  • promote - set env constraints

Wednesday, June 27, 12

slide-150
SLIDE 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.

Wednesday, June 27, 12

slide-151
SLIDE 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

Wednesday, June 27, 12

slide-152
SLIDE 152

Spork: Upload

$> knife spork upload apache2 Uploading and freezing apache2 [1.0.7] upload complete

Wednesday, June 27, 12

slide-153
SLIDE 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

Wednesday, June 27, 12

slide-154
SLIDE 154

Spork

Wednesday, June 27, 12

slide-155
SLIDE 155

Spork

  • Worked well, avoided the issues it was

designed for

Wednesday, June 27, 12

slide-156
SLIDE 156

Spork

  • Worked well, avoided the issues it was

designed for

  • Subsequently evolved

Wednesday, June 27, 12

slide-157
SLIDE 157

Spork

  • Worked well, avoided the issues it was

designed for

  • Subsequently evolved
  • A lot of input & work came from Devs

Wednesday, June 27, 12

slide-158
SLIDE 158

Spork

  • Worked well, avoided the issues it was

designed for

  • Subsequently evolved
  • A lot of input & work came from Devs
  • Organic evolution

Wednesday, June 27, 12

slide-159
SLIDE 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

Wednesday, June 27, 12

slide-160
SLIDE 160

Spork: Evolution

Wednesday, June 27, 12

slide-161
SLIDE 161

Spork: Evolution

  • Safety Checks

Wednesday, June 27, 12

slide-162
SLIDE 162

Spork: Evolution

  • Safety Checks
  • Extra Features

Wednesday, June 27, 12

slide-163
SLIDE 163

Spork: Safety Checks

Wednesday, June 27, 12

slide-164
SLIDE 164

Spork: Safety Checks

  • Before promoting, check version is

uploaded...

Wednesday, June 27, 12

slide-165
SLIDE 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

Wednesday, June 27, 12

slide-166
SLIDE 166

Spork: Safety Checks

  • Before promoting, check version is

uploaded...

  • Check if you’re promoting changes to more

than you thought....

Wednesday, June 27, 12

slide-167
SLIDE 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.

Wednesday, June 27, 12

slide-168
SLIDE 168

Spork: Features

Wednesday, June 27, 12

slide-169
SLIDE 169

Spork: Features

  • Default Environments

Wednesday, June 27, 12

slide-170
SLIDE 170

Spork: Features

  • Default Environments
  • Git support

Wednesday, June 27, 12

slide-171
SLIDE 171

Spork: Features

  • Default Environments
  • Git support
  • Chat notifications + Gist (upload and

promote)

Wednesday, June 27, 12

slide-172
SLIDE 172

Spork: Features

  • Default Environments
  • Git support
  • Chat notifications + Gist (upload and

promote)

  • IRCCat

Wednesday, June 27, 12

slide-173
SLIDE 173

Spork: Features

  • Default Environments
  • Git support
  • Chat notifications + Gist (upload and

promote)

  • IRCCat
  • Hipchat (courtesy of Secondmarket)

Wednesday, June 27, 12

slide-174
SLIDE 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

Wednesday, June 27, 12

slide-175
SLIDE 175

Spork: Features

  • Default Environments
  • Git support
  • Chat notifications + Gist (upload and

promote)

  • IRCCat
  • Hipchat (courtesy of Secondmarket)
  • Graphite (on promote)

Wednesday, June 27, 12

slide-176
SLIDE 176

Features: Graphite

Wednesday, June 27, 12

slide-177
SLIDE 177

Spork: Features

  • Default Environments
  • Git support
  • Chat notifications + Gist (upload and

promote)

  • IRCCat
  • Hipchat (courtesy of Secondmarket)
  • Graphite (on promote)
  • Foodcritic (on upload)

Wednesday, June 27, 12

slide-178
SLIDE 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

Wednesday, June 27, 12

slide-179
SLIDE 179

Use the Source!

tiny.cc/velocity2012

Wednesday, June 27, 12

slide-180
SLIDE 180

We’re hiring!

BoF on Tuesday

  • r just come and say Hi :)

Wednesday, June 27, 12