puppet at github - puppetconf 2013

156
Puppet at GitHub

Upload: puppet-labs

Post on 10-May-2015

2.840 views

Category:

Technology


2 download

DESCRIPTION

"Puppet at GitHub" by Will Farrington Junior Executive Assistant to the Assistant VP of Operations, GitHub, Inc. Presentation Overview: At GitHub, we've got a pretty large Puppet code base to manage all of the GitHub.com infrastructure. It's also pretty old; a little over four and a half years of history lives in our Puppet repo. We've also hired a lot more people over the past few years, going from around 70 people a year ago to more than double that now. This talk focuses on how we continue to embrace the GitHub principles of constantly shipping, iterative improvement, constant experimenting, and no managers to manage our rather large Puppet infrastructure with success. Speaker Bio: Will is a developer and operations engineer. Will works on system operations at GitHub, where he spends most of his time slinging Puppet to manage GitHub's extensive production environment where he spends a great deal of time on automating, homogenizing, and improving GitHub's development environments. Prior to GitHub, he spent the previous 3 years using Ruby and Puppet to build and scale massive web services with Highgroove Studios and Rails Machine.

TRANSCRIPT

Page 1: Puppet at GitHub - PuppetConf 2013

Puppet at GitHub

Page 2: Puppet at GitHub - PuppetConf 2013

@wfa r rGitHub

Operations

Known Aliases:

King of Kebabs

The Chairman

Mr. Caremad !

Page 3: Puppet at GitHub - PuppetConf 2013

The State of Puppet at GitHub

"

Page 4: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

github/boxen

Page 5: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

~1.5 years old

Page 6: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

open-sourced ~7 months ago

Page 7: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

~240 open-source puppet modules

Page 8: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

puppet 3.latest

Page 9: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

supports ruby 1.8.7, 1.9.3, 2.0.0

Page 10: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

hiera

Page 11: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

OS X

Page 12: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

Linux support in-progress

Page 13: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

#tomorrow @ 2:20pm

Page 14: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

github/puppet

Page 15: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

$

Page 16: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

~5 years old

Page 17: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

0.24.x — 2.7.x

Page 18: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

121 modules

Page 19: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

~280k lines of code

Page 20: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

every single employee has commit access

Page 21: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

15.5k commits to master past 12 months

Page 22: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

by 86 contributors

Page 23: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %

% %

Page 24: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %

% %

42.5%

Page 25: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % %

% %

now with ops taken out

Page 26: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

0

100

200

300

40020

12-0

8-25

2012

-10-2

0

2012

-12-15

2013

-02-

09

2013

-04-

06

2013

-06-

01

2013

-07-

27

commits on master per week, last 12 months

Page 27: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

0

1000

2000

3000

4000total commits by author past year

Page 28: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

0

175

350

525

700total commits by author past year, except ops

Page 29: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

0

175

350

525

700total commits by authors with >10 commits, past year, except ops

Page 30: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

single puppetmaster

Page 31: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

rubygems

Page 32: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

ruby 1.8.7

Page 33: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

unicorn

Page 34: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

puppet 2.7.latest

Page 35: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

~600 nodes

Page 36: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

run hourly via crond

Page 37: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

puppetdb

Page 38: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

nagiosdb

Page 39: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

"yo puppetdb, gimme all your nagios::object::* resources so I can

update this nagios config"

Page 40: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

filtergendb

Page 41: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

"yo puppetdb, gimme all the filtergen::rule resources I would realize

so I can update this filtergen config"

Page 42: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

⚡ puppetdb ⚡

Page 43: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

as it turns out, an api call is faster than running puppet on a host

Page 44: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

gpanel

Page 45: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

"Imagine Puppet Dashboard meets Razor and went on a weekend trip to the

beach with the Heroku API and drank epic amounts of blue drink"

Page 46: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

aka we reinvented our own, smaller version of Foreman

Page 47: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

inventory

Page 48: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

Page 49: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

Page 50: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

app configuration

Page 51: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

Page 52: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

versioning of configuration values

Page 53: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

Create nil => 1Update 1 => 2Delete 2 => nil

Page 54: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

let's make credential rolling less awful

Page 55: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

provisioning

Page 56: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

provisioning is typically awful

Page 57: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

we sprinkled in some ChatOps

Page 58: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

Page 59: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

a little bit later...

Page 60: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

<MACHINE>

Page 61: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

enc

Page 62: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

we have the dumbest ENC out there

Page 63: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

Page 64: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

# /usr/local/sbin/fetch_gpanel_enc \ fe1.rs.github.com

---parameters: gpanel_cabinet: D20-13 gpanel_enabled: true gpanel_monitored: false

Page 65: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

we never specify classes via the ENC

Page 66: Puppet at GitHub - PuppetConf 2013

" The State of Puppet at GitHub

any variables we pass through are prefixed with gpanel_

Page 67: Puppet at GitHub - PuppetConf 2013

How GitHub writes Puppet

(

Page 68: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

rodjek/puppet-lint

Page 69: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

Page 70: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

if you aren't using puppet-lint to audit your puppet codebase,

you are doing it wrong

Page 71: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

puppet-lint enforces the Puppet Labs style guide

Page 72: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

puppet-lint can even fix a ton of linter errors for you

Page 73: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

put it in a pre-commit hook

Page 74: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

$ git commit -am "can't lint this"

modules/github/manifests/role/redis.pp: syntax okmodules/github/manifests/role/redis.pp - WARNING: => is not properly aligned on line 118

1 errors found, aborting commit.

Page 75: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

and then buy rodjek a beer

Page 76: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

rodjek/rspec-puppet

Page 77: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

Page 78: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

if you aren't writing tests for your puppet code before

running it on a server,you are doing it wrong

Page 79: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

use whatever framework/library

Page 80: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

rspec-puppet just happens to be a pretty good one

Page 81: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

put it in a pre-commit hook

Page 82: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

$ git commit -am "tests dont pass but whatever lol"

1) Expected redis::server would include class "more_than_a_single_c_thread"

1 failures encountered, aborting commit.

Page 83: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

and then buy rodjek another beer

Page 84: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

node definitions

Page 85: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

we don't use an ENC to describe node classes

Page 86: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

node /^github-redis\d+/ { class { 'github::role::polling_redis': enabled => $::gpanel_enabled, environment => $::gpanel_environment, private_ipv4 => $::ipaddress, }}

Page 87: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

abstractions all the way down

Page 88: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

treat your site classes as cascades down to your dist classes

Page 89: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

class redis::server( # params) {

class { 'redis::config': ... } -> class { 'redis::package': ... } ~> class { 'redis::service': ... }

}

Page 90: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

class github::redis( # params) inherits github::defaults {

$memory = $environment ? { 'stg' => '2G', default => $half_memory_gb }

class { 'redis::server': ... }

}

Page 91: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

class github::role::polling_redis( # params) {

class { 'github::redis': # overrides based on specific node }

}

Page 92: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

augeas

Page 93: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

you know what's not awesome?

Page 94: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

an erb template that requires your class to take 52876423 parameters so you can configure every possible

value in my.cnf

Page 95: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

augeas { 'my.cnf/performance': context => '/files/etc/mysql/my.cnf/mysqld', changes => [ # automatic dump/restore 'set innodb_auto_lru_dump 18000',

# innodb "set innodb_buffer_pool_size ${innodb_buffer_pool_size}", 'set innodb_log_file_size 256M', 'set innodb_log_buffer_size 8M', 'set innodb_lazy_drop_table 1', ],require => Percona::Server[$::fqdn]

}

Page 96: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

it can seem complex and scary

Page 97: Puppet at GitHub - PuppetConf 2013

( How GitHub Writes Puppet

it is an amazing tool

Page 98: Puppet at GitHub - PuppetConf 2013

How GitHub ships Puppet

)

Page 99: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

continuous integration

Page 100: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

commit gets pushed

Page 101: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

jenkins runs the test suite

Page 102: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

status gets posted back to GitHub.com

Page 103: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

tmm1/test-queue

Page 104: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

Page 105: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

remembers how to better parallelize tests

Page 106: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

continuous deployment

Page 107: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

tests passed for commit, Hubot auto-deploys

Page 108: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

branch deploy everything

Page 109: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

a lot of shops have a few environments

Page 110: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

testing

staging

production

Page 111: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

currently we have 181 environments

Page 112: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

that's not the same as 181 nodesnot running production

Page 113: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

we only have 5 of those

Page 114: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

Hubot automatically merges the master branch before allowing any

branch to deploy

Page 115: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

ChatOps

Page 116: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

202 employees100% access to Puppet

100% trust

Page 117: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

the list of roles you'd never think would touch production puppet

webkit developercore git developers

core ruby developerssvn developers

search developerfrontend designers

windows developersmac developers

supportenterprise sales

Page 118: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

every puppet run happens in chat

Page 119: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

all puppet output goes to chat

Page 120: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

everyone can see everything

Page 121: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

everyone can do anything

Page 122: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

hands-on learning, by accident

Page 123: Puppet at GitHub - PuppetConf 2013

) How GitHub Ships Puppet

eliminate disruptive questions

Page 124: Puppet at GitHub - PuppetConf 2013

The Future of Puppet at GitHub

*

Page 125: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

puppet 3.x

Page 126: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

upgrading a large, old codebase from 2.7 to 3 is really painful

Page 127: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

we've been talking about it for a year

Page 128: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

we're still trying to push forward, but...

Page 129: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

helping maintain security fixes for 2.7

Page 130: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

goal is to be on 3.2 by end of year

Page 131: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

ruby 2.0

Page 132: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

moar faster rubby

Page 133: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

we get this for free when we move to 3

Page 134: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

mcollective

Page 135: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

aka the story of github/shell and the wonders of ssh in a for-loop

Page 136: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

there are a lot of cool things about mcollective

Page 137: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

I think it will be a part of our stack in the future

Page 138: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

but you can still go pretty damn far with bash and ssh

Page 139: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

even more puppetdb tooling

Page 140: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

waiting for multiple runs to converge exported resources is painful

Page 141: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

use the puppetdb API to skip all that

Page 142: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

even more gpanel integration

Page 143: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

"databags"

Page 144: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

"node search"

Page 145: Puppet at GitHub - PuppetConf 2013

* The Future of Puppet at GitHub

steal good ideas from other tools

Page 146: Puppet at GitHub - PuppetConf 2013

closing thoughts

Page 147: Puppet at GitHub - PuppetConf 2013

"all software is terrible"

— anyone who's worked with software long enough

Page 148: Puppet at GitHub - PuppetConf 2013

"no software is better than no software"— rtomayko

Page 149: Puppet at GitHub - PuppetConf 2013

the plumbing doesn't matter when all you care about is the porcelain

Page 150: Puppet at GitHub - PuppetConf 2013

write some damned good porcelain

Page 151: Puppet at GitHub - PuppetConf 2013
Page 152: Puppet at GitHub - PuppetConf 2013

THIS IS RODJEK

Page 153: Puppet at GitHub - PuppetConf 2013

HE'S NORMALLY NOT THIS BLURRY

Page 154: Puppet at GitHub - PuppetConf 2013

HE IS ALSO NOT MY BROTHER, BUT YOU REALLY SHOULD BUY

HIM A BEER

Page 155: Puppet at GitHub - PuppetConf 2013

YOU SHOULD BUY THIS MAN A LOT OF BEER

Page 156: Puppet at GitHub - PuppetConf 2013

THANKS

https://speakerdeck.com/wfarr/

puppet-at-github-puppetconf-2013

!