Boxen: How to Manage an Army of Laptops

166
boxen

description

"Boxen: How to Manage an Army of Laptops", a talk about Boxen and related bits of Puppet thoughts by Will Farrington of GitHub at Puppet Camp San Francisco 2013.

Transcript of Boxen: How to Manage an Army of Laptops

Page 1: Boxen: How to Manage an Army of Laptops

boxen

Page 2: Boxen: How to Manage an Army of Laptops

wfarr

Page 3: Boxen: How to Manage an Army of Laptops

ops andfriction

Page 4: Boxen: How to Manage an Army of Laptops

boxen

Page 5: Boxen: How to Manage an Army of Laptops

why should i care about this?

Page 6: Boxen: How to Manage an Army of Laptops

STORY TIME

Page 7: Boxen: How to Manage an Army of Laptops

once upon a shitty time

Page 8: Boxen: How to Manage an Army of Laptops

Time to get set up.I want to hack on stuff!

once upon a shitty time

Page 9: Boxen: How to Manage an Army of Laptops

Okay, install XCode...

once upon a shitty time

Page 10: Boxen: How to Manage an Army of Laptops

and rbenv...

once upon a shitty time

Page 11: Boxen: How to Manage an Army of Laptops

and a bunch of rubies...

once upon a shitty time

Page 12: Boxen: How to Manage an Army of Laptops

and pow...

once upon a shitty time

Page 13: Boxen: How to Manage an Army of Laptops

and nodejs...

once upon a shitty time

Page 14: Boxen: How to Manage an Army of Laptops

and bower...

once upon a shitty time

Page 15: Boxen: How to Manage an Army of Laptops

and bundler...

once upon a shitty time

Page 16: Boxen: How to Manage an Army of Laptops

and mysql...

once upon a shitty time

Page 17: Boxen: How to Manage an Army of Laptops

and postgresql...

once upon a shitty time

Page 18: Boxen: How to Manage an Army of Laptops

probably okay withoutmongodb...

once upon a shitty time

Page 19: Boxen: How to Manage an Army of Laptops

definitely needelasticsearch though...

once upon a shitty time

Page 20: Boxen: How to Manage an Army of Laptops

huh... well I can'tconnect to the db!

once upon a shitty time

Page 21: Boxen: How to Manage an Army of Laptops

and now ruby issegfaulting?!

once upon a shitty time

Page 22: Boxen: How to Manage an Army of Laptops

wat

once upon a shitty time

Page 23: Boxen: How to Manage an Army of Laptops
Page 24: Boxen: How to Manage an Army of Laptops
Page 25: Boxen: How to Manage an Army of Laptops
Page 26: Boxen: How to Manage an Army of Laptops

I just want toship cool stuff...

Page 27: Boxen: How to Manage an Army of Laptops

USS COOL STU

FF

Page 28: Boxen: How to Manage an Army of Laptops

I thought I wrote an install guide

that people could just walk through.

I wonder what broke...

Ops Person

Page 29: Boxen: How to Manage an Army of Laptops
Page 30: Boxen: How to Manage an Army of Laptops

A SOLUTION IS BORN

Page 31: Boxen: How to Manage an Army of Laptops
Page 32: Boxen: How to Manage an Army of Laptops
Page 33: Boxen: How to Manage an Army of Laptops
Page 34: Boxen: How to Manage an Army of Laptops

once upon an awesome time

Page 35: Boxen: How to Manage an Army of Laptops

Time to get set up.I want to hack on stuff!

once upon an awesome time

Page 36: Boxen: How to Manage an Army of Laptops

Okay, I go tohttps://boxen.company.com

once upon an awesome time

Page 37: Boxen: How to Manage an Army of Laptops

It says I should installXcode real quick. Sure.

once upon an awesome time

Page 38: Boxen: How to Manage an Army of Laptops

Now I copy and paste thisone line into the Terminal.

once upon an awesome time

Page 39: Boxen: How to Manage an Army of Laptops

Oh, hey! It's doing stuff.I guess I'll grab a coffee.

once upon an awesome time

Page 40: Boxen: How to Manage an Army of Laptops

I swear this is a different coffee cup

from before

Page 41: Boxen: How to Manage an Army of Laptops

Rad! It says it's done andto open a new Terminal.

once upon an awesome time

Page 42: Boxen: How to Manage an Army of Laptops

Holy automated awesome,Batman! I'm ready to work!

once upon an awesome time

Page 43: Boxen: How to Manage an Army of Laptops

so like what is boxen actually?

Page 44: Boxen: How to Manage an Army of Laptops
Page 45: Boxen: How to Manage an Army of Laptops

stdlib

Page 46: Boxen: How to Manage an Army of Laptops
Page 47: Boxen: How to Manage an Army of Laptops

wtf is a devops

Page 48: Boxen: How to Manage an Army of Laptops
Page 49: Boxen: How to Manage an Army of Laptops
Page 50: Boxen: How to Manage an Army of Laptops
Page 51: Boxen: How to Manage an Army of Laptops

homebrew, git, gcc, .dev dns, nginx, rbenv, ruby-build, a bunch of ruby versions, nodenv, a bunch

of nodejs versions, heroku toolchain, hub, mysql, postgresql,

elasticsearch, riak, java, and a whole lot more available

Page 52: Boxen: How to Manage an Army of Laptops

what do i do with boxen?

Page 53: Boxen: How to Manage an Army of Laptops

MANAGE PROJECTS

Page 54: Boxen: How to Manage an Army of Laptops
Page 55: Boxen: How to Manage an Army of Laptops

Hmm. Let's hack ongithub/github!

Page 56: Boxen: How to Manage an Army of Laptops

The README says to run`boxen github`

Page 57: Boxen: How to Manage an Army of Laptops

Okay, it's doing stuff...I think?

The Puppet logging format is hella

confusing to most people, seriously.

Page 58: Boxen: How to Manage an Army of Laptops

What just happened?

Page 59: Boxen: How to Manage an Army of Laptops

1. Clone github/github2. Make sure dpkg is installed3. Make sure icu4c is installed4. Make sure libgithub is installed5. Make sure md5sha1sum is installed6. Make sure solr is installed7. Make sure mysql is installed and running8. Make sure elasticsearch is installed and running9. Make sure memcached is installed and running10. Make sure the dev and tests DBs are created11. Make sure python is installed12. Make sure redis is installed and running13. Make sure Ruby 1.9.3 is installed14. Make sure ~/github/github is set to use 1.9.315. Notify the user of any new environment variables Boxen provides

and let them know to restart their shell16. Make sure github/pages-jekyll is cloned17. Make sure github/pages-jekyll is set to use 1.9.318. Make sure environment config for github/pages-jekyll is setup

Page 60: Boxen: How to Manage an Army of Laptops

1. Clone github/github2. Make sure dpkg is installed3. Make sure icu4c is installed4. Make sure libgithub is installed5. Make sure md5sha1sum is installed6. Make sure solr is installed7. Make sure mysql is installed and running8. Make sure elasticsearch is installed and running9. Make sure memcached is installed and running10. Make sure the dev and tests DBs are created11. Make sure python is installed12. Make sure redis is installed and running13. Make sure Ruby 1.9.3 is installed14. Make sure ~/github/github is set to use 1.9.315. Notify the user of any new environment variables Boxen provides

and let them know to restart their shell16. Make sure github/pages-jekyll is cloned17. Make sure github/pages-jekyll is set to use 1.9.318. Make sure environment config for github/pages-jekyll is setup

i had to decrease the

font size by 24pt just to

fit it all

on one slide

and this is the annotated version

Page 61: Boxen: How to Manage an Army of Laptops

okay, well, what about the code to make this happen?

Page 62: Boxen: How to Manage an Army of Laptops

class projects::github { include dpkg include icu4c include libgithub

include projects::pages-jekyll

boxen::project { 'github': elasticsearch => true, memcached => true, mysql => [ 'github_enterprise', 'github_development', 'github_test' ], nginx => 'projects/github/nginx.conf.erb', python => true, redis => true, ruby => '1.9.3', source => 'github/github' }

package { 'md5sha1sum': }}

Page 63: Boxen: How to Manage an Army of Laptops

what about your "average" app?

Page 64: Boxen: How to Manage an Army of Laptops

class projects::battle_station { boxen::project { 'battle_station': dotenv => true, mysql => true, nginx => true, redis => true, ruby => '2.0.0', source => 'github/battle_station' }}

Page 65: Boxen: How to Manage an Army of Laptops

MANAGE EVERYTHING ELSE TOO

Page 66: Boxen: How to Manage an Army of Laptops
Page 67: Boxen: How to Manage an Army of Laptops

That's cool and all, butwhat about me?

Page 68: Boxen: How to Manage an Army of Laptops

I need to live on the bleedingedge version of `sl`.

Page 69: Boxen: How to Manage an Army of Laptops

And my screensaver needs100% more lasers.

Page 70: Boxen: How to Manage an Army of Laptops

Hmm. Some documentation!"Personal manifests?"

Page 71: Boxen: How to Manage an Army of Laptops

Oh, this looks kind of neat.Maybe I'll do it.

Page 72: Boxen: How to Manage an Army of Laptops

class people::wfarr { include emacs include zsh

include projects::battle_station}

Page 73: Boxen: How to Manage an Army of Laptops

class people::wfarr { git::config::global { 'alias.st': value => 'status' ; 'alias.ci': value => 'commit' ; 'user.name': value => 'wfarr' ; }}

Page 74: Boxen: How to Manage an Army of Laptops

class people::wfarr { repository { "/Users/${::boxen_user}/.emacs.d": source => 'wfarr/.emacs.d' }}

Page 75: Boxen: How to Manage an Army of Laptops

class people::wfarr { boxen::osx_defaults { 'Fix bluetooth audio streaming because OSX is dumb': ensure => present, domain => 'com.apple.BluetoothAudioAgent', key => shellquote('Apple Bitpool Min (editable)'), value => 50, user => $::boxen_user ; }}

Page 76: Boxen: How to Manage an Army of Laptops

CLI

Page 77: Boxen: How to Manage an Army of Laptops

$ boxen

# run it

Page 78: Boxen: How to Manage an Army of Laptops

$ boxen --projects

# list projects Boxen knows about

Page 79: Boxen: How to Manage an Army of Laptops

$ boxen <project>

# run it but include <project> in the catalog automatically

Page 80: Boxen: How to Manage an Army of Laptops

$ boxen --debug

# run it but include <project> in the catalog automatically

Page 81: Boxen: How to Manage an Army of Laptops

UPDATE EASILY

Page 82: Boxen: How to Manage an Army of Laptops

$ boxen

Boxen is up-to-date.

Page 83: Boxen: How to Manage an Army of Laptops

$ boxen

Boxen has a dirty tree, won't auto-update!

Page 84: Boxen: How to Manage an Army of Laptops

$ boxen

Boxen has unpushed commits on master, won't auto-update!

Page 85: Boxen: How to Manage an Army of Laptops

$ boxen

Boxen on a non-master branch 'new-project', won't auto-update!

Page 86: Boxen: How to Manage an Army of Laptops

FAIL GRACEFULLY

Page 87: Boxen: How to Manage an Army of Laptops

$ boxenError: ZOMG at /opt/boxen/repo/modules/people/manifests/wfarr.pp:8 on node scruffy.gateway.github.lan

Sorry! Creating an issue on github/totally-a-madeup-repo-name.

Page 88: Boxen: How to Manage an Army of Laptops

CODEZ

Page 89: Boxen: How to Manage an Army of Laptops

CODEZ

who failed

Page 90: Boxen: How to Manage an Army of Laptops

CODEZ

how long ago

Page 91: Boxen: How to Manage an Army of Laptops

CODEZ machine

Page 92: Boxen: How to Manage an Army of Laptops

CODEZ

os version

Page 93: Boxen: How to Manage an Army of Laptops

CODEZ shell

Page 94: Boxen: How to Manage an Army of Laptops

CODEZref

Page 95: Boxen: How to Manage an Army of Laptops

CODEZcompare view

Page 96: Boxen: How to Manage an Army of Laptops

CODEZgit status

Page 97: Boxen: How to Manage an Army of Laptops

CODEZ

full command

Page 98: Boxen: How to Manage an Army of Laptops

CODEZ

full log

Page 99: Boxen: How to Manage an Army of Laptops

i fix the error and run `boxen`

Page 100: Boxen: How to Manage an Army of Laptops

CODEZ

Page 101: Boxen: How to Manage an Army of Laptops

via issues api

Page 102: Boxen: How to Manage an Army of Laptops

# config/boxen.rb

ENV['BOXEN_REPO_NAME'] = \ 'github/boxen'

ENV['BOXEN_ISSUES_ENABLED'] = 'yes'

Page 103: Boxen: How to Manage an Army of Laptops

This is pretty freaking rad!

Page 104: Boxen: How to Manage an Army of Laptops

It's just code.Maybe I can write this too...

Page 105: Boxen: How to Manage an Army of Laptops

66 GitHubbers (~42%) have contributed

personal manifests or project manifests since

October

Page 106: Boxen: How to Manage an Army of Laptops

4 Supportocats

5 Designers

44 Devs

7 Ops

3 Trainers

1 Education Liaison

1 Enterprise Salesperson

1 Security Bloke

Page 107: Boxen: How to Manage an Army of Laptops
Page 108: Boxen: How to Manage an Army of Laptops
Page 109: Boxen: How to Manage an Army of Laptops

really using it

Page 110: Boxen: How to Manage an Army of Laptops

EMBRACE AND EXTEND

Page 111: Boxen: How to Manage an Army of Laptops

create higher level abstractions

Page 112: Boxen: How to Manage an Army of Laptops

class projects::battle_station { boxen::project { 'battle_station': dotenv => true, mysql => true, nginx => true, redis => true, ruby => '2.0.0', source => 'github/battle_station' }}

This is the same for 80% of cases

Page 113: Boxen: How to Manage an Army of Laptops

let's optimize for our use-case

Page 114: Boxen: How to Manage an Army of Laptops

define github::project( $source = "github/${title}" # a whole bunch of other params) {

boxen::project { $name: source => $source, # that bunch of other params }}

The sanest default, but easy to override

Page 115: Boxen: How to Manage an Army of Laptops

maybe all of our ops team should get certain things by default

Page 116: Boxen: How to Manage an Army of Laptops

class github::environment { include_github_team_environments()}

Page 117: Boxen: How to Manage an Army of Laptops

class github::environment::ops { include github::environment::ops::vagrant

include projects::battle_station include projects::octostatus include projects::puppet}

Page 118: Boxen: How to Manage an Army of Laptops

START SIMPLE

Page 119: Boxen: How to Manage an Army of Laptops

write new modules inside your repo first and extract later

Page 120: Boxen: How to Manage an Army of Laptops

~/github/boxen » ls -1 modules cmakectagsgithublibgithublibmicrohttpdnodejspeopleprojectsstrap

Page 121: Boxen: How to Manage an Army of Laptops

~/github/boxen » ls -1 modules cmakectagsgithublibgithublibmicrohttpdnodejspeopleprojectsstrap

WIP v2.0.0 nodejs module

Page 122: Boxen: How to Manage an Army of Laptops

start abstractions in Puppet

Page 123: Boxen: How to Manage an Army of Laptops

refactor into Ruby later if performance demands it

Page 124: Boxen: How to Manage an Army of Laptops

define nodejs::version( $ensure = present, $compile = false, $version = $title,) { require nodejs

case $ensure { present: { # exec to install }

absent: { # exec or file to rm } }}

Page 125: Boxen: How to Manage an Army of Laptops

Time: Filebucket: 0.00 Vagrant plugin: 0.00 Nodejs: 4.37 Sudoers: 0.00 File line: 0.00 Ini setting: 0.01 Group: 0.10 Repository: 0.12 File: 0.66 Service: 1.54 Package: 112.76 Total: 130.29 Last run: 1365003143 Rbenv gem: 2.23 Exec: 3.36 Config retrieval: 7.27

Page 126: Boxen: How to Manage an Army of Laptops

if it's consistently slowing down the run, then optimize

Page 127: Boxen: How to Manage an Army of Laptops

define nodejs::version( $ensure = present, $compile = false, $version = $title,) { require nodejs

nodejs { $version: ensure => $ensure, compile => $compile, }}

This impl. happens to fork less

Page 128: Boxen: How to Manage an Army of Laptops

DO WHATEVER WORKS

Page 129: Boxen: How to Manage an Army of Laptops

practicality beats purity /perfect is the enemy of good enough

Page 130: Boxen: How to Manage an Army of Laptops

but...

Page 131: Boxen: How to Manage an Army of Laptops

WHY ISN'T THIS JUST A BUNCH OF SCRIPTS?

Page 132: Boxen: How to Manage an Army of Laptops

idempotent behavioris kind of a big deal

Page 133: Boxen: How to Manage an Army of Laptops

shell scripts get the job done if you live in a wonderful vacuum where constraints never change and the dependencies between resources

are forever static

Page 134: Boxen: How to Manage an Army of Laptops

the real world really doesn't care one bit

Page 135: Boxen: How to Manage an Army of Laptops

telling people"if it breaks, just reinstall"

is a copout

Page 136: Boxen: How to Manage an Army of Laptops

if people expect to your software to behave a certain way, and you have the power to automate that

behavior and then don't,you're being a jerk to your users

user experience common sense 101

Page 137: Boxen: How to Manage an Army of Laptops

WHY ISN'T THIS IN CHEF?

Page 138: Boxen: How to Manage an Army of Laptops

so glad people don't ask this one at puppet conferences!

Page 139: Boxen: How to Manage an Army of Laptops

transcend tools;write beautiful porcelain

Page 140: Boxen: How to Manage an Army of Laptops

WHAT ABOUT SECURITY UPDATES?

Page 141: Boxen: How to Manage an Army of Laptops

THE DARK AGES OF SECURITY INTERACTION

Page 142: Boxen: How to Manage an Army of Laptops

THE DARK AGES OF SECURITY INTERACTION

Java browser plugins are literally going to beat you

up, kick your puppy, and eat all of your Doritos! zomg!

Page 143: Boxen: How to Manage an Army of Laptops

lol are you kidding me?I have important codez to write.

I'll do it later.Now be gone, demon!

HINT: They're never going to do it.

Page 144: Boxen: How to Manage an Army of Laptops
Page 145: Boxen: How to Manage an Army of Laptops
Page 146: Boxen: How to Manage an Army of Laptops
Page 147: Boxen: How to Manage an Army of Laptops

THE awesome AGES OF SECURITY INTERACTION

Page 148: Boxen: How to Manage an Army of Laptops

THE awesome AGES OF SECURITY INTERACTION

Hey folks! I just had to push an update to Boxen to disable

Java plugins in browsers. Sorry about that! Here's a PR with more context: <link>.

Page 149: Boxen: How to Manage an Army of Laptops

THE awesome AGES OF SECURITY INTERACTION

Oh snap - audit season!Let me just review our

code to see if we're in the clear and secure.

Page 150: Boxen: How to Manage an Army of Laptops

what if i have problems?

Page 151: Boxen: How to Manage an Army of Laptops

pull requests

Page 152: Boxen: How to Manage an Army of Laptops

issues

Page 153: Boxen: How to Manage an Army of Laptops

irc.freenode.net

Page 154: Boxen: How to Manage an Army of Laptops

be chuck yeager

Page 155: Boxen: How to Manage an Army of Laptops

Savannah

Atlanta

Page 156: Boxen: How to Manage an Army of Laptops

Savannah

Atlanta

Page 157: Boxen: How to Manage an Army of Laptops

Savannah

Atlanta

Page 158: Boxen: How to Manage an Army of Laptops

Savannah

Atlanta

Page 159: Boxen: How to Manage an Army of Laptops

Savannah

Atlanta

Page 160: Boxen: How to Manage an Army of Laptops

"So, we're uh in the air. We made it. That's uh good news,

obviously."

Page 161: Boxen: How to Manage an Army of Laptops

"Flight attendants, if you could just hang on to uh... whatever..."

Page 162: Boxen: How to Manage an Army of Laptops
Page 163: Boxen: How to Manage an Army of Laptops

The point at which I realize I'm going to

die

The point at which I think the worst is

over

Page 164: Boxen: How to Manage an Army of Laptops

detail text

Page 165: Boxen: How to Manage an Army of Laptops

wfarr

speakerdeck.com/wfarr/boxen-puppetcamp-sf-2013

Page 166: Boxen: How to Manage an Army of Laptops

thanks