SlideShare a Scribd company logo
1 of 123
Download to read offline
Jesse Newland
             jnewland




hey errbody
my name is jesse newland
I do ops at GitHub
Puppet
                                            at
                    GitHub
And today I’m going to be talking about Puppet at GitHub.

Really, I’m telling a story in two parts.
All of the amazing Puppet
  OSS projects @rodjek
 has written but doesn’t
    want to talk about
First... I’ll be talking about all of the amazing Puppet open source projects Tim Sharpe has
written but doesn’t want to talk about

and how we use them at GitHub
*
And then, I want to introduce you to the star of the GitHub Ops team, Hubot, and tell you a
little bit about something we’ve been calling ChatOps
the

            Setup
But, before I get into all of that, I'm actually going to talk about an
upcoming talk, one by a coworker of mine at GitHub. Will Farrington
is going to be speaking tomorrow at 2:45pm about The Setup, our
Puppet-powered GitHubber laptop management solution. It's
amazing. It's one of the coolest uses of Puppet I've ever seen, and
it's going to completely change the way you think about your
development environment.

But I’m not going to be talking about any of that today.

So, yeah, go to Will's talk tommorrow. You won't be disappointed.
Puppet
                                          at
                   GitHub
So I guess you could say that I’m talking about
THE of
          REST
                     Puppet
                                         at
                   GitHub
the rest of puppet at github. For the scope of this talk, I’m going to be talking about the
Puppet infrastructure that runs github.com
4 years, >100k LOC




We’ve been managing GitHub’s infrastructure with Puppet for 4 years, since the move to
Rackspace. There’s a ton of code, and we’re developing at a rapid pace.
Simple
But we are obsessed with keeping our Puppet deployment simple
Single
             Master
We use a single puppetmaster running lots of unicorns. Nothing fancy. It works for now.

However, we will need to scale this tier up or out in about 6 months if the trends look right.
We’ll probably switch to two load balanced puppetmasters around that time.
cron FTW
 # cat /etc/cron.d/puppet
 13 * * * * root /usr/bin/

We don’t run the agent, but rather run puppet on cron every hour in combination with runs
triggered via Hubot (more on that later)
No
                            ENC
We don’t use an external node classifier
([a-z0-9-_]+)(d+)([a-z]?).(.*).github.com
 $ cat manifests/nodes/janky.rscloud.pp

 node /^jankyd+.rscloud.github.com$/ {
   github::role::janky { 'janky':
     public_address => dns_lookup($fqdn),
     nginx_hostname => $fqdn,
   }
 }



Instead, we give nodes DNS names that adhere to a naming convention that maps them to a
pre-defined role
Where the magic happens
$ head modules/github/manifests/role/janky.pp

define github::role::janky($public_address,
                           $nginx_hostname='',
                           $god=true
                          ) {

    github::core { 'janky': }

    include github::app::janky

    github::nginx { 'janky': }

}
Role definitions are where the magic happens. We try to DRY common functionality into our
core module and into other simple classes or defines so that role definitions read like a nice
summary of what makes this role different from others
Heavy use of augeas
  augeas { 'my.cnf/avoid_cardinality_skew':
    context => '/files/etc/mysql/my.cnf/mysqld/',
    changes => [
       'set innodb_stats_auto_update 0',
       'set innodb_stats_on_metadata 0',
       'set innodb_stats_on_metadata 64'
    ],
    require => Percona::Server[$::fqdn],
  }




We generally try to avoid templates for configuration files in favor of using aw ge us

Lets us manage the small pieces of configuration we care about and use the OS defaults for
the things we don't.
BORING
But I don’t want to just show all of you Puppet code for thirty minutes. That's boring
What’s interesting
   about Puppet at
      GitHub?
I’d rather talk about what's interesting about how we use Puppet at GitHub. And what I think
is the most interesting is that we focus heavily on ensuring the Puppet development workflow
is easily accessible to everyone at GitHub.
Making
     Puppet Less
        Scary
We’re doing our best to make puppet less scary for people that aren’t familiar with it, so they
can help the Ops team grow and evolve our infrastructure. We’re doing some things right
here, but there’s still a lot of work to do.
I’ve been thinking about this a lot recently as we’ve just had two large infrastructure projects
shipped by people that were completely or relatively new to puppet. First, Derek Greentree
shipped a Cassandra cluster,,,
And Adam Roben shipped puppet manifests for our windows build and CI servers.
this
                               is
                              good
This is an awesome trend, and I want it to continue. So I thought I’d talk a bit today about
what we’re doing to try to enable even more of this.
Flow just like
  a (GitHub)
Ruby project
For us, an important part of making Puppet development accessible for other developers at
GitHub is making the development flow on our puppet codebase as similar as possible to that
of any other GitHub Ruby project. That means sticking with some common conventions
Setup
  $ ./script/bootstrap

Like making it as easy to setup as any other project at GitHub
$ cat Gemfile
        source :rubygems

        gem     'puppet',             '2.7.18'
        gem     'facter',             '1.6.10'
        gem     'rspec-puppet',       '0.1.2'
        gem     'rake',               '0.8.7'
        gem     'puppet-lint',        '0.2.1'
        gem     'ruby-augeas',        '0.3.0'
        gem     'json',               '1.5.1'
        gem     'fog',                '1.3.1'
        gem     'librarian-puppet',   '0.9.4'
        gem     'parallel_tests'


So ruby deps are managed by Bundler
$ cat Puppetfile

forge "http://forge.puppetlabs.com"

mod 'puppetlabs/apt'
...




And puppet deps are managed by librarian-puppet, a bundler-like library that manages the
puppet modules your infrastructure depends on and install them directly from GitHub
repositories.

I’m of the opinion that the unit of open source currency is no longer a tarball downloaded
from a something named *forge. It’s a GitHub repo. All of the developers at GitHub feel the
same way, so Tim wrote librarian puppet
          rodjek / librarian-puppet




For those of you keeping score at home, that’s the first of Tim Sharpe’s open source projects
that I’ve mentioned. Hi Tim!
Making puppet flow like other projects at GitHub means ensuring we have good editor
support for the language
 rodjek / vim-puppet




vim-puppet, that’s two.
Tests
  $ ./script/cibuild

It means running tests is a simple one-step process
TESTS!
Tests are super important. A solid and easy to use test harness helps build developer
confidence in a new language.
Safety
             net
And tests are crucial safety net for helping people cut their teeth on Puppet if they haven’t
ever touched it before.
rspec-puppet
  should contain_github__firewall_rule('internal_network')

  should contain_ssmtp__relay_to('smtp').with_relay_host('smtp')

  should contain_file('/etc/logstash/logstash.conf')

  should include_class('github::ksplice')

  should contain_networking__bond('bond0').with(
           :gateway        => '172.22.0.2',
           :arp_ip_target => '172.22.0.2',
           :up_commands    => nil
         )


We use rspec-puppet heavily. If you haven’t used rspec-puppet yet, go check it out right
now.

It’s amazing.

There are no less than three talks about it at Puppetconf, so I’m not going to talk about HOW
to use it today, just touch a little bit on how WE use it.
 rodjek / rspec-puppet




rspec-puppet, that’s three
role
 describe 'github::role::fe' do
   let(:title) { 'fe' }
   let(:node) { 'fe1.rs.github.com' }
   let(:params) {
     {




                                                                    specs
       :public_address     => '207.97.227.242/27',
       :private_address    => '172.22.1.59/22',
       :git_weight         => '16'
     }
   }
   let(:facts) {




                                                                      are
     {
       :ipaddress       => '172.22.1.59',
       :operatingsystem => 'Debian',
       :datacenter      => 'rackspace-iad2',
     }




                                                                     king
   }

   it do
     should contain_github__core('fe')
     ...
   end
 end



We try our best to adequately test our individual puppet modules, but our central and most
frequently touched specs exercise our role system. There’s one spec for each role which
describes its intended functionality.

These specs focus on critical functionality of each role, and help a great deal to build
confidence that we’re not introducing regressions when adding or refactoring functionality or
working in other roles.
.git/hooks/pre-commit
 $ git commit -am "lolbadchange"
 modules/github/manifests/role/fe.pp:err: Could
 not parse for environment production: Syntax
 error at 'allow_outbound_syslog'; expected '}'
 at /Users/jnewland/github/puppet/modules/github/
 manifests/role/fe.pp:31
 modules/github/manifests/role/fe.pp - WARNING:
 => is not properly aligned on line 626



For an even faster feedback loop than running specs, all Puppet dev environments
automatically get setup with a pre-commit hook that checks for syntax errors and ensures
your changes confirm to the Puppet Style guide.

This has proved amazingly useful for Puppet novices and experts alike, novices finding it
helps them understand language conventions quickly and guides them towards solutions,
and experts using it to catch typos and help them not look like novices.
 rodjek / puppet-lint




puppet-lint, that’s four, btw.
specs run on each push



          auto deploy on CI pass
rspec-puppet and puppet-lint are automatically run by CI on every commit on every branch
pushed to our Puppet repo.

Once master passes CI, puppet is automatically deployed
As you can see, Hubot automates a lot of the process of rolling out Puppet

That example covered pushing changes to master, but what about a Pull-Request based
workflow?
Say we have a pull request for a branch we want to merge, and that we’ve reviewed the code
and it all looks good.
branches
                                  ==
   environments
On each deploy, we turn all git branches into puppet environments.
This combined with heaven, our capistrano-powered deployment API we interact with via
Hubot, enables us to experiment with unmerged Puppet branches in a powerful way
So, to safely merge this pull request...
hubot ci status puppet/git-gh13

            deploy:apply puppet/git-gh13 staging/fs1

            deploy:noop puppet/git-gh13 prod/fs1


 # merge pull request


 hubot deploy:apply puppet to prod/fs

            graph me -1h @collectd.load(fs*)

            log me hooks github/github


You might ask Hubot to confirm its build status
Build #108816
   (5fe75932f26ea62cb5fc5e3d0cb302cc2461d11e)
   of puppet/git-gh13 was successful(421s) github/
              puppet@567ea48...5fe7593




Yup, looks good.
hubot ci status puppet/git-gh13

             deploy:apply puppet/git-gh13 staging/fs1

             deploy:noop puppet/git-gh13 prod/fs1


 # merge pull request


 hubot deploy:apply puppet to prod/fs

             graph me -1h @collectd.load(fs*)

             log me hooks github/github


Then roll the branch out to a staging box to make everything applies cleanly there.
**  [out :: REDACTED ] Bootstrapping...
  **  [out :: REDACTED ] Gem environment up-to-date.
  **  [out :: REDACTED ] Running librarian-puppet...
  **  [out :: REDACTED ] Generating puppet environments...
  **  [out :: REDACTED ] Cleaning up deleted branches...
  **  [out :: REDACTED ] Done!
  **  [out :: REDACTED ] Sending 'restart' command
  **  [out :: REDACTED ] The following watches were affected:
  **  [out :: REDACTED ] puppetmaster_unicorn
  **  [out :: fs1a.stg.github.com] info: Applying
      configuration version
      '8fb1a2716d5f950b836e511471a2bdac3ed27090'
  ** [out :: fs1a.stg.github.com] notice: /Stage[main]
      Github::Common_packages/Package[git]/ensure: ensure changed
      '1:1.7.10-1+github12' to '1:1.7.10-1+github13'
  ...




Yup, looks good.
hubot ci status puppet/git-gh13

             deploy:apply puppet/git-gh13 staging/fs1

             deploy:noop puppet/git-gh13 prod/fs1


 # merge pull request


 hubot deploy:apply puppet to prod/fs

             graph me -1h @collectd.load(fs*)

             log me hooks github/github


Then, if you wanted an extra layer of confidence, you could noop the branch against a
production node
**  [out :: REDACTED ] Bootstrapping...
  **  [out :: REDACTED ] Gem environment up-to-date.
  **  [out :: REDACTED ] Running librarian-puppet...
  **  [out :: REDACTED ] Generating puppet environments...
  **  [out :: REDACTED ] Cleaning up deleted branches...
  **  [out :: REDACTED ] Done!
  **  [out :: REDACTED ] Sending 'restart' command
  **  [out :: REDACTED ] The following watches were affected:
  **  [out :: REDACTED ] puppetmaster_unicorn
  **  [out :: fs1a.rs.github.com] info: Applying
      configuration version
      '8fb1a2716d5f950b836e511471a2bdac3ed27090'
  ** [out :: fs1a.rs.github.com] notice: /Stage[main]/
      Github::Common_packages/Package[git]/ensure: would have
      changed from '1:1.7.10-1+github12' to
      '1:1.7.10-1+github13'
  ...




Yup, looks good
hubot ci status puppet/git-gh13

             deploy:apply puppet/git-gh13 staging/fs1

             deploy:noop puppet/git-gh13 prod/fs1


 # merge pull request


 hubot deploy:apply puppet to prod/fs

             graph me -1h @collectd.load(fs*)

             log me hooks github/github


Next, you’d merge the pull request. If you stopped here, the code would gradually roll out to
all affected nodes over the next hour.
hubot ci status puppet/git-gh13

             deploy:apply puppet/git-gh13 staging/fs1

             deploy:noop puppet/git-gh13 prod/fs1


 # merge pull request


 hubot deploy:apply puppet to prod/fs

             graph me -1h @collectd.load(fs*)

             log me hooks github/github


If you wanted the rollout to happen faster than that, you could force a puppet run on the
affected class of nodes
**  [out :: REDACTED ] Bootstrapping...
  **  [out :: REDACTED ] Gem environment up-to-date.
  **  [out :: REDACTED ] Running librarian-puppet...
  **  [out :: REDACTED ] Generating puppet environments...
  **  [out :: REDACTED ] Cleaning up deleted branches...
  **  [out :: REDACTED ] Done!
  **  [out :: REDACTED ] Sending 'restart' command
  **  [out :: REDACTED ] The following watches were affected:
  **  [out :: REDACTED ] puppetmaster_unicorn
  **  [out :: fs1a.rs.github.com] info: Applying
      configuration version
      '8fb1a2716d5f950b836e511471a2bdac3ed27090'
  ** [out :: fs7b.rs.github.com] info: Applying
      configuration version
      '8fb1a2716d5f950b836e511471a2bdac3ed27090'
  ** [out :: fs1a.rs.github.com] notice: /Stage[main]/
      Github::Common_packages/Package[git]/ensure: ensure
      changed '1:1.7.10-1+github12' to '1:1.7.10-1+github13'
  ** [out :: fs7b.rs.github.com] notice: /Stage[main]/
      Github::Common_packages/Package[git]/ensure: ensure
      changed '1:1.7.10-1+github12' to '1:1.7.10-1+github13'
  ...




Yup, that looks good.
hubot ci status puppet/git-gh13

            deploy:apply puppet/git-gh13 staging/fs1

            deploy:noop puppet/git-gh13 prod/fs1


 # merge pull request


 hubot deploy:apply puppet to prod/fs

            graph me -1h @collectd.load(fs*)

            log me hooks github/github


Then you’d probably want to check out load to make sure nothing went crazy
Yup, looks good
hubot ci status puppet/git-gh13

            deploy:apply puppet/git-gh13 staging/fs1

            deploy:noop puppet/git-gh13 prod/fs1


 # merge pull request


 hubot deploy:apply puppet to prod/fs

            graph me -1h @collectd.load(fs*)

            log me hooks github/github


...and maybe check some logs or other related metrics to confirm your change didn’t break
something
Yup, looks good
ChatOps
How we interact with Puppet via Hubot is a great example of a core principal of how we do
ops at GitHub. We’ve been calling it ChatOps recently.
Essentially, ChatOps is the result of Hubot becoming sentient, and decreeing, among other
things, that we now address him as “Supreme Leader” and communicate with our
infrastructure though his secure channels alone.

We occasionally observe him speaking in tongues that sound eerily like YouTube comments.
                        Hubot
Actually, that’s not it at all. Hubot is the star of our Ops team.
heaven
       shell               Hubot                                       janky
                                graphme
We use hubot day in day out to interact with other simple tools we’ve written over JSON apis.
ALL OF
  hubotshell
                                   heaven
                                                                       janky

THE APIS                        graphme
Hubot interacts nicely with tons of external APIs too. If you have a JSON API, making your
service work with Hubot is a piece of cake.
Why is this stupid
          chat bot so
       important to Ops?
But why do we obsess about Hubot so much? It’s just a chat bot, right?

There are some distinct upsides to this approach we’ve notices as our use of Hubot in Ops
has grown
hubot ci status puppet/git-gh13

             deploy:apply puppet/git-gh13 staging/fs1

             deploy:noop puppet/git-gh13 prod/fs1


 # merge pull request


 hubot deploy:apply puppet to prod/fs

             graph me -1h @collectd.load(fs*)

             log me hooks github/github


Remember the flow I just showed you for rolling out puppet changes to our infrastructure?
Everyone sees all
    of that happen
   on their first day
Everyone sees all of this happen from the minute they join GitHub. It’s right there, in the Ops
room, right in the middle of the conversation in campfire.
You don’t just see how to roll out puppet, you see how to...
hubot ci status github/smoke-perf




check the status of branch’s last build
hubot deploy github/smoke-perf to prod/fe1




deploy a any branch of any github app to any server
hubot graph me -10min @app-perf




get graphs of the app’s recent performance
hubot procs unicorn




check the status of unicorns across all frontends
hubot resque critical




check the status of the resque critical queue
hubot graph me -10min @collectd.load(fe*)




check load on the frontends
hubot conns fe1




check current connections to a frontend that you suspect has a problem
hubot log me smoke fe1




grab smoke logs for that frontend and realize that you did, in fact, break it
hubot lbctl disable fe1




take it out of the load balancer
hubot status yellow Bad deploy. Reverting now.




update the status blog
hubot who’s on call




determine who is currently on call so you can apologize to them
hubot pingdom checks




check pingdom to make sure you haven’t broken everything
hubot upset me




chill yourself out really quick
hubot deploy github to prod/fe1




revert back to master on the busted frontend
hubot log me smoke fe1




verify things have returned to normal
hubot air drum me




get pumped up because you fixed it
hubot lbctl enable fe1




bring the fixed frontend back into the rotation
hubot status green All systems go.




clear alerts on the status page
hubot whois 4.9.23.22




Once the outage has been resolved, you might see how to grab whois information for an IP
that exhibited suspicious activity in the logs you saw
hubot khanify spammers




and how to hit meme generator to make a joke when you realize that IP is a spammer
hubot play in the air tonight




then someone would queue up the song that popped into their head when they thought
about drums and gorillas at the same time
hubot tweet@github PuppetConf Drinkup Friday
                    night at 8:30 at Zeke’s
                    (3rd & Brannan)




and then finish it all off with a tweet about the Drinkup we’re throwing friday night
ChatOps
ChatOps means building tools that make it easier to operate your infrastructure via Hubot
than via Terminal or Chrome
By placing tools
              directly in the
              middle of the
              conversation
Because...
Everyone
              is pairing
           all of the time
This is the core concept behind ChatOps.
Teaching                      by

   doing
Teaching by doing is awesome
This was always my main
motivation with hubot - teaching
  by doing by making things
    visible. It's an extremely
       powerful teaching
    technique - @rtomayko
Ryan Tomayko had this in mind from the very first commits to hubot, which just presented a
simple wrapper around a repository of shell scripts we use for management and monitoring
our infrastructure.
This is how I respond to “how to I do X” questions in Campfire now.

If there’s not yet Hubot functionality to do a thing, we try to write it.
Communicate
    by

                  doing
Placing tools in the middle of the conversation also means you get communication of your
work for free.

If you’re doing something in a shell or on a website, you have to do it, then tell people about
it. If you do it with hubot, that comes free.
THINGS I
HAVEN’T ASKED
  RECENTLY
For example, here are a few things I haven’t asked recently because Hubot has told me the
answer
THINGS I
HAVEN’T ASKED
 how’s that deploy going?

    RECENTLY
THINGS I
  are you deploying that or should i?

HAVEN’T ASKED
 how’s that deploy going?

    RECENTLY
THINGS I
  are you deploying that or should i?

HAVEN’T ASKED
 how’s that deploy going?
is anyone responding to that nagios alert?

    RECENTLY
THINGS I
   is that branch green?
  are you deploying that or should i?

HAVEN’T ASKED
 how’s that deploy going?
is anyone responding to that nagios alert?

    RECENTLY
THINGS I
   is that branch green?
  are you deploying that or should i?

HAVEN’T ASKED
 how’s that deploy going?
is anyone responding to that nagios alert?

    RECENTLY
  how does load look?
did anyone update the status page?

     THINGS I
   is that branch green?
  are you deploying that or should i?

HAVEN’T ASKED
 how’s that deploy going?
is anyone responding to that nagios alert?

    RECENTLY
  how does load look?
did anyone update the status page?

     THINGS I
   is that branch green?
  are you deploying that or should i?

HAVEN’T ASKED
 how’s that deploy going?
is anyone responding to that nagios alert?

    RECENTLY
  how does load look?
        did that deploy finish?
Free communication is especially crucial in a distributed environment.
Our Ops team is entirely remote, so Campfire is our default means of communication.
http://www.flickr.com/photos/7997249@N06/6061305639/
This is extremely helpful during outages or other situations that require tactical response.

You don’t have to SAY that you’re spraying water on the fire, people SEE you doing it.
Hide            the

                        ugly
Another awesome benefit of ChatOps-ing all of the things is that you can hide ugly interfaces
and design exactly the interaction you want with some simple porcelain commands
My favorite example of this is ugliest of the ugly, Nagios.
[nines] hubot opened issue #4263: Nagios
   (229906) - fs3b/syslog - Tue Sept 25 23:40:18
   PDT 2012. github/nines#4263




Hubot politely delivers nagios alerts directly into chat
hubot nagios ack fs3b/syslog

  # fix stuff

               nagios check fs3b/syslog

               nagios status fs3b/syslog


  hubot nagios downtime fs3b/syslog 90

               nagios mute fs3b/syslog

               nagios unmute fs3b/syslog
Which we can interact with without any unnecessary eye bleeding. Making this easy means
developers and other ops engineers actually mute or schedule downtime when they’re testing
things.
Mobile
              FTW
Yet another awesome benefit of ChatOps is that you get mobile support for free
Well, that is, if you have a team of awesome iOS developers that have built an actually
functioning Campfire client for the iPhone

This lets you do anything hubot can do from your phone.

Which means from your couch. Or your bed. Or a beach in Hawaii.

Which means you can fix a lot of things without pulling your laptop out of your bag.
ChatOps
That’s ChatOps at its finest.
And now for
                  something
                  completely
                   different
While I’m showing off mobile stuff, I thought I’d slip in a demo of something else we’ve done
to make Ops more mobile friendly.
We’ve hacked together support for PagerDuty alerts via Apple Push Notifications. When you
swipe on the alert, you go directly to the PagerDuty mobile UI for an incident
Which lets you ack an alert
while you’re still in bed
or on the couch.
Boom
I can’t even begin to tell you how happy this makes me, and how less shitty it makes being
on-call
So, who better to summarize all of this than Hubot himself. I asked him what he thought
about ChatOps. Here’s what he said:
ChatOps all the things.

Listen to what Hubot said. You’ll love it. Your ops team will love it.

And you’ll help other developers learn how to interact with ops tools without any additional
work.

That’s awesome.
Work at GitHub
      jesse@github.com




If you can’t ChatOps all the things at your gig now, you could always just come work with me
at GitHub.

Shoot me an email if you’re interested.
Thanks!




That’s all I have. Thanks for listening! any questions?
Tomorrow @ 8:30 PM

                                                               Zeke’s

                     3rd & Brannan
While I still have everyone’s attention, I wanted to mention the GitHub Drinkup we’re
throwing for Puppetconf again. It’s tomorrow night at 8:30pm at Zeke’s, which is on the
corner of 3rd and Brannan, 
 everyone’s invited. I’ll see you there.

Thanks again!

More Related Content

What's hot

Replacing "exec" with a type and provider: Return manifests to a declarative ...
Replacing "exec" with a type and provider: Return manifests to a declarative ...Replacing "exec" with a type and provider: Return manifests to a declarative ...
Replacing "exec" with a type and provider: Return manifests to a declarative ...Puppet
 
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013Puppet
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterZendCon
 
Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013Puppet
 
Cooking Perl with Chef
Cooking Perl with ChefCooking Perl with Chef
Cooking Perl with ChefDavid Golden
 
Oliver hookins puppetcamp2011
Oliver hookins puppetcamp2011Oliver hookins puppetcamp2011
Oliver hookins puppetcamp2011Puppet
 
Writing Custom Puppet Types and Providers to Manage Web-Based Applications
Writing Custom Puppet Types and Providers to Manage Web-Based ApplicationsWriting Custom Puppet Types and Providers to Manage Web-Based Applications
Writing Custom Puppet Types and Providers to Manage Web-Based ApplicationsTim Cinel
 
Twig: Friendly Curly Braces Invade Your Templates!
Twig: Friendly Curly Braces Invade Your Templates!Twig: Friendly Curly Braces Invade Your Templates!
Twig: Friendly Curly Braces Invade Your Templates!Ryan Weaver
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryTatsuhiko Miyagawa
 
Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.catPablo Godel
 
Mastering Maven 2.0 In 1 Hour V1.3
Mastering Maven 2.0 In 1 Hour V1.3Mastering Maven 2.0 In 1 Hour V1.3
Mastering Maven 2.0 In 1 Hour V1.3Matthew McCullough
 
Master the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and SilexMaster the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and SilexRyan Weaver
 
Developing IT infrastructures with Puppet
Developing IT infrastructures with PuppetDeveloping IT infrastructures with Puppet
Developing IT infrastructures with PuppetAlessandro Franceschi
 

What's hot (20)

Replacing "exec" with a type and provider: Return manifests to a declarative ...
Replacing "exec" with a type and provider: Return manifests to a declarative ...Replacing "exec" with a type and provider: Return manifests to a declarative ...
Replacing "exec" with a type and provider: Return manifests to a declarative ...
 
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life better
 
Maven 3.0 at Øredev
Maven 3.0 at ØredevMaven 3.0 at Øredev
Maven 3.0 at Øredev
 
Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013
 
Cooking Perl with Chef
Cooking Perl with ChefCooking Perl with Chef
Cooking Perl with Chef
 
Oliver hookins puppetcamp2011
Oliver hookins puppetcamp2011Oliver hookins puppetcamp2011
Oliver hookins puppetcamp2011
 
Puppet modules for Fun and Profit
Puppet modules for Fun and ProfitPuppet modules for Fun and Profit
Puppet modules for Fun and Profit
 
Writing Custom Puppet Types and Providers to Manage Web-Based Applications
Writing Custom Puppet Types and Providers to Manage Web-Based ApplicationsWriting Custom Puppet Types and Providers to Manage Web-Based Applications
Writing Custom Puppet Types and Providers to Manage Web-Based Applications
 
Twig: Friendly Curly Braces Invade Your Templates!
Twig: Friendly Curly Braces Invade Your Templates!Twig: Friendly Curly Braces Invade Your Templates!
Twig: Friendly Curly Braces Invade Your Templates!
 
Puppi. Puppet strings to the shell
Puppi. Puppet strings to the shellPuppi. Puppet strings to the shell
Puppi. Puppet strings to the shell
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.cat
 
Plack - LPW 2009
Plack - LPW 2009Plack - LPW 2009
Plack - LPW 2009
 
Tatsumaki
TatsumakiTatsumaki
Tatsumaki
 
Mastering Maven 2.0 In 1 Hour V1.3
Mastering Maven 2.0 In 1 Hour V1.3Mastering Maven 2.0 In 1 Hour V1.3
Mastering Maven 2.0 In 1 Hour V1.3
 
Anatomy of a reusable module
Anatomy of a reusable moduleAnatomy of a reusable module
Anatomy of a reusable module
 
Master the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and SilexMaster the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and Silex
 
Developing IT infrastructures with Puppet
Developing IT infrastructures with PuppetDeveloping IT infrastructures with Puppet
Developing IT infrastructures with Puppet
 
Beyond Phoenix
Beyond PhoenixBeyond Phoenix
Beyond Phoenix
 

Similar to Puppet at GitHub / ChatOps

Puppet at GitHub
Puppet at GitHubPuppet at GitHub
Puppet at GitHubPuppet
 
Boxen: How to Manage an Army of Laptops and Live to Talk About It
Boxen: How to Manage an Army of Laptops and Live to Talk About ItBoxen: How to Manage an Army of Laptops and Live to Talk About It
Boxen: How to Manage an Army of Laptops and Live to Talk About ItPuppet
 
Boxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of LaptopsBoxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of LaptopsPuppet
 
PuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPhil Zimmerman
 
The Secrets of The FullStack Ninja - Part A - Session I
The Secrets of The FullStack Ninja - Part A - Session IThe Secrets of The FullStack Ninja - Part A - Session I
The Secrets of The FullStack Ninja - Part A - Session IOded Sagir
 
CoffeeScript: A beginner's presentation for beginners copy
CoffeeScript: A beginner's presentation for beginners copyCoffeeScript: A beginner's presentation for beginners copy
CoffeeScript: A beginner's presentation for beginners copyPatrick Devins
 
Puppet 3: Present and Future Tense
Puppet 3: Present and Future TensePuppet 3: Present and Future Tense
Puppet 3: Present and Future TenseEric Sorenson
 
Puppet 3: Present and Future Tense
Puppet 3: Present and Future TensePuppet 3: Present and Future Tense
Puppet 3: Present and Future TensePuppet
 
Cloud meets Fog & Puppet A Story of Version Controlled Infrastructure
Cloud meets Fog & Puppet A Story of Version Controlled InfrastructureCloud meets Fog & Puppet A Story of Version Controlled Infrastructure
Cloud meets Fog & Puppet A Story of Version Controlled InfrastructureHabeeb Rahman
 
Matt Gauger - Git & Github web414 December 2010
Matt Gauger - Git & Github web414 December 2010Matt Gauger - Git & Github web414 December 2010
Matt Gauger - Git & Github web414 December 2010Matt Gauger
 
Killer R10K Workflow - PuppetConf 2014
Killer R10K Workflow - PuppetConf 2014Killer R10K Workflow - PuppetConf 2014
Killer R10K Workflow - PuppetConf 2014Puppet
 
How to build your own OpenStack distro using Puppet OpenStack
How to build your own OpenStack distro using Puppet OpenStackHow to build your own OpenStack distro using Puppet OpenStack
How to build your own OpenStack distro using Puppet OpenStackOpenStack
 
Inside GitHub
Inside GitHubInside GitHub
Inside GitHuberr
 
Infrastructure as code might be literally impossible
Infrastructure as code might be literally impossibleInfrastructure as code might be literally impossible
Infrastructure as code might be literally impossibleice799
 
rake puppetexpert:create - Puppet Camp Silicon Valley 2014
rake puppetexpert:create - Puppet Camp Silicon Valley 2014rake puppetexpert:create - Puppet Camp Silicon Valley 2014
rake puppetexpert:create - Puppet Camp Silicon Valley 2014nvpuppet
 
Infrastructure as code might be literally impossible / Joe Domato (packageclo...
Infrastructure as code might be literally impossible / Joe Domato (packageclo...Infrastructure as code might be literally impossible / Joe Domato (packageclo...
Infrastructure as code might be literally impossible / Joe Domato (packageclo...Ontico
 

Similar to Puppet at GitHub / ChatOps (20)

Puppet at GitHub
Puppet at GitHubPuppet at GitHub
Puppet at GitHub
 
Boxen: How to Manage an Army of Laptops and Live to Talk About It
Boxen: How to Manage an Army of Laptops and Live to Talk About ItBoxen: How to Manage an Army of Laptops and Live to Talk About It
Boxen: How to Manage an Army of Laptops and Live to Talk About It
 
Boxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of LaptopsBoxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of Laptops
 
PuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With Notes
 
Inside GitHub with Chris Wanstrath
Inside GitHub with Chris WanstrathInside GitHub with Chris Wanstrath
Inside GitHub with Chris Wanstrath
 
The Secrets of The FullStack Ninja - Part A - Session I
The Secrets of The FullStack Ninja - Part A - Session IThe Secrets of The FullStack Ninja - Part A - Session I
The Secrets of The FullStack Ninja - Part A - Session I
 
CoffeeScript: A beginner's presentation for beginners copy
CoffeeScript: A beginner's presentation for beginners copyCoffeeScript: A beginner's presentation for beginners copy
CoffeeScript: A beginner's presentation for beginners copy
 
Puppet 3: Present and Future Tense
Puppet 3: Present and Future TensePuppet 3: Present and Future Tense
Puppet 3: Present and Future Tense
 
Puppet 3: Present and Future Tense
Puppet 3: Present and Future TensePuppet 3: Present and Future Tense
Puppet 3: Present and Future Tense
 
Cloud meets Fog & Puppet A Story of Version Controlled Infrastructure
Cloud meets Fog & Puppet A Story of Version Controlled InfrastructureCloud meets Fog & Puppet A Story of Version Controlled Infrastructure
Cloud meets Fog & Puppet A Story of Version Controlled Infrastructure
 
Matt Gauger - Git & Github web414 December 2010
Matt Gauger - Git & Github web414 December 2010Matt Gauger - Git & Github web414 December 2010
Matt Gauger - Git & Github web414 December 2010
 
Killer R10K Workflow - PuppetConf 2014
Killer R10K Workflow - PuppetConf 2014Killer R10K Workflow - PuppetConf 2014
Killer R10K Workflow - PuppetConf 2014
 
How to build your own OpenStack distro using Puppet OpenStack
How to build your own OpenStack distro using Puppet OpenStackHow to build your own OpenStack distro using Puppet OpenStack
How to build your own OpenStack distro using Puppet OpenStack
 
Automate Yo' Self
Automate Yo' SelfAutomate Yo' Self
Automate Yo' Self
 
Inside GitHub
Inside GitHubInside GitHub
Inside GitHub
 
Infrastructure as code might be literally impossible
Infrastructure as code might be literally impossibleInfrastructure as code might be literally impossible
Infrastructure as code might be literally impossible
 
Git hooks
Git hooksGit hooks
Git hooks
 
Git::Hooks
Git::HooksGit::Hooks
Git::Hooks
 
rake puppetexpert:create - Puppet Camp Silicon Valley 2014
rake puppetexpert:create - Puppet Camp Silicon Valley 2014rake puppetexpert:create - Puppet Camp Silicon Valley 2014
rake puppetexpert:create - Puppet Camp Silicon Valley 2014
 
Infrastructure as code might be literally impossible / Joe Domato (packageclo...
Infrastructure as code might be literally impossible / Joe Domato (packageclo...Infrastructure as code might be literally impossible / Joe Domato (packageclo...
Infrastructure as code might be literally impossible / Joe Domato (packageclo...
 

More from Puppet

Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet
 
Puppetcamp r10kyaml
Puppetcamp r10kyamlPuppetcamp r10kyaml
Puppetcamp r10kyamlPuppet
 
2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)Puppet
 
Puppet camp vscode
Puppet camp vscodePuppet camp vscode
Puppet camp vscodePuppet
 
Modules of the twenties
Modules of the twentiesModules of the twenties
Modules of the twentiesPuppet
 
Applying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codeApplying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codePuppet
 
KGI compliance as-code approach
KGI compliance as-code approachKGI compliance as-code approach
KGI compliance as-code approachPuppet
 
Enforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationEnforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationPuppet
 
Keynote: Puppet camp compliance
Keynote: Puppet camp complianceKeynote: Puppet camp compliance
Keynote: Puppet camp compliancePuppet
 
Automating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowAutomating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowPuppet
 
Puppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet
 
Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Puppet
 
Accelerating azure adoption with puppet
Accelerating azure adoption with puppetAccelerating azure adoption with puppet
Accelerating azure adoption with puppetPuppet
 
Puppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet
 
ServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkPuppet
 
Take control of your dev ops dumping ground
Take control of your  dev ops dumping groundTake control of your  dev ops dumping ground
Take control of your dev ops dumping groundPuppet
 
100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy SoftwarePuppet
 
Puppet User Group
Puppet User GroupPuppet User Group
Puppet User GroupPuppet
 
Continuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsContinuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsPuppet
 
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyThe Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyPuppet
 

More from Puppet (20)

Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepo
 
Puppetcamp r10kyaml
Puppetcamp r10kyamlPuppetcamp r10kyaml
Puppetcamp r10kyaml
 
2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)
 
Puppet camp vscode
Puppet camp vscodePuppet camp vscode
Puppet camp vscode
 
Modules of the twenties
Modules of the twentiesModules of the twenties
Modules of the twenties
 
Applying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codeApplying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance code
 
KGI compliance as-code approach
KGI compliance as-code approachKGI compliance as-code approach
KGI compliance as-code approach
 
Enforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationEnforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automation
 
Keynote: Puppet camp compliance
Keynote: Puppet camp complianceKeynote: Puppet camp compliance
Keynote: Puppet camp compliance
 
Automating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowAutomating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNow
 
Puppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet: The best way to harden Windows
Puppet: The best way to harden Windows
 
Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020
 
Accelerating azure adoption with puppet
Accelerating azure adoption with puppetAccelerating azure adoption with puppet
Accelerating azure adoption with puppet
 
Puppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael Pinson
 
ServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin Reeuwijk
 
Take control of your dev ops dumping ground
Take control of your  dev ops dumping groundTake control of your  dev ops dumping ground
Take control of your dev ops dumping ground
 
100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software
 
Puppet User Group
Puppet User GroupPuppet User Group
Puppet User Group
 
Continuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsContinuous Compliance and DevSecOps
Continuous Compliance and DevSecOps
 
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyThe Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
 

Recently uploaded

"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 

Recently uploaded (20)

"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 

Puppet at GitHub / ChatOps

  • 1.
  • 2. Jesse Newland jnewland hey errbody my name is jesse newland I do ops at GitHub
  • 3. Puppet at GitHub And today I’m going to be talking about Puppet at GitHub. Really, I’m telling a story in two parts.
  • 4. All of the amazing Puppet OSS projects @rodjek has written but doesn’t want to talk about First... I’ll be talking about all of the amazing Puppet open source projects Tim Sharpe has written but doesn’t want to talk about and how we use them at GitHub
  • 5. * And then, I want to introduce you to the star of the GitHub Ops team, Hubot, and tell you a little bit about something we’ve been calling ChatOps
  • 6. the Setup But, before I get into all of that, I'm actually going to talk about an upcoming talk, one by a coworker of mine at GitHub. Will Farrington is going to be speaking tomorrow at 2:45pm about The Setup, our Puppet-powered GitHubber laptop management solution. It's amazing. It's one of the coolest uses of Puppet I've ever seen, and it's going to completely change the way you think about your development environment. But I’m not going to be talking about any of that today. So, yeah, go to Will's talk tommorrow. You won't be disappointed.
  • 7. Puppet at GitHub So I guess you could say that I’m talking about
  • 8. THE of REST Puppet at GitHub the rest of puppet at github. For the scope of this talk, I’m going to be talking about the Puppet infrastructure that runs github.com
  • 9. 4 years, >100k LOC We’ve been managing GitHub’s infrastructure with Puppet for 4 years, since the move to Rackspace. There’s a ton of code, and we’re developing at a rapid pace.
  • 10. Simple But we are obsessed with keeping our Puppet deployment simple
  • 11. Single Master We use a single puppetmaster running lots of unicorns. Nothing fancy. It works for now. However, we will need to scale this tier up or out in about 6 months if the trends look right. We’ll probably switch to two load balanced puppetmasters around that time.
  • 12. cron FTW # cat /etc/cron.d/puppet 13 * * * * root /usr/bin/ We don’t run the agent, but rather run puppet on cron every hour in combination with runs triggered via Hubot (more on that later)
  • 13. No ENC We don’t use an external node classifier
  • 14. ([a-z0-9-_]+)(d+)([a-z]?).(.*).github.com $ cat manifests/nodes/janky.rscloud.pp node /^jankyd+.rscloud.github.com$/ { github::role::janky { 'janky': public_address => dns_lookup($fqdn), nginx_hostname => $fqdn, } } Instead, we give nodes DNS names that adhere to a naming convention that maps them to a pre-defined role
  • 15. Where the magic happens $ head modules/github/manifests/role/janky.pp define github::role::janky($public_address, $nginx_hostname='', $god=true ) { github::core { 'janky': } include github::app::janky github::nginx { 'janky': } } Role definitions are where the magic happens. We try to DRY common functionality into our core module and into other simple classes or defines so that role definitions read like a nice summary of what makes this role different from others
  • 16. Heavy use of augeas augeas { 'my.cnf/avoid_cardinality_skew': context => '/files/etc/mysql/my.cnf/mysqld/', changes => [ 'set innodb_stats_auto_update 0', 'set innodb_stats_on_metadata 0', 'set innodb_stats_on_metadata 64' ], require => Percona::Server[$::fqdn], } We generally try to avoid templates for configuration files in favor of using aw ge us Lets us manage the small pieces of configuration we care about and use the OS defaults for the things we don't.
  • 17. BORING But I don’t want to just show all of you Puppet code for thirty minutes. That's boring
  • 18. What’s interesting about Puppet at GitHub? I’d rather talk about what's interesting about how we use Puppet at GitHub. And what I think is the most interesting is that we focus heavily on ensuring the Puppet development workflow is easily accessible to everyone at GitHub.
  • 19. Making Puppet Less Scary We’re doing our best to make puppet less scary for people that aren’t familiar with it, so they can help the Ops team grow and evolve our infrastructure. We’re doing some things right here, but there’s still a lot of work to do.
  • 20. I’ve been thinking about this a lot recently as we’ve just had two large infrastructure projects shipped by people that were completely or relatively new to puppet. First, Derek Greentree shipped a Cassandra cluster,,,
  • 21. And Adam Roben shipped puppet manifests for our windows build and CI servers.
  • 22. this is good This is an awesome trend, and I want it to continue. So I thought I’d talk a bit today about what we’re doing to try to enable even more of this.
  • 23. Flow just like a (GitHub) Ruby project For us, an important part of making Puppet development accessible for other developers at GitHub is making the development flow on our puppet codebase as similar as possible to that of any other GitHub Ruby project. That means sticking with some common conventions
  • 24. Setup $ ./script/bootstrap Like making it as easy to setup as any other project at GitHub
  • 25. $ cat Gemfile source :rubygems gem 'puppet', '2.7.18' gem 'facter', '1.6.10' gem 'rspec-puppet', '0.1.2' gem 'rake', '0.8.7' gem 'puppet-lint', '0.2.1' gem 'ruby-augeas', '0.3.0' gem 'json', '1.5.1' gem 'fog', '1.3.1' gem 'librarian-puppet', '0.9.4' gem 'parallel_tests' So ruby deps are managed by Bundler
  • 26. $ cat Puppetfile forge "http://forge.puppetlabs.com" mod 'puppetlabs/apt' ... And puppet deps are managed by librarian-puppet, a bundler-like library that manages the puppet modules your infrastructure depends on and install them directly from GitHub repositories. I’m of the opinion that the unit of open source currency is no longer a tarball downloaded from a something named *forge. It’s a GitHub repo. All of the developers at GitHub feel the same way, so Tim wrote librarian puppet
  • 27. rodjek / librarian-puppet For those of you keeping score at home, that’s the first of Tim Sharpe’s open source projects that I’ve mentioned. Hi Tim!
  • 28. Making puppet flow like other projects at GitHub means ensuring we have good editor support for the language
  • 29.  rodjek / vim-puppet vim-puppet, that’s two.
  • 30. Tests $ ./script/cibuild It means running tests is a simple one-step process
  • 31. TESTS! Tests are super important. A solid and easy to use test harness helps build developer confidence in a new language.
  • 32. Safety net And tests are crucial safety net for helping people cut their teeth on Puppet if they haven’t ever touched it before.
  • 33. rspec-puppet should contain_github__firewall_rule('internal_network') should contain_ssmtp__relay_to('smtp').with_relay_host('smtp') should contain_file('/etc/logstash/logstash.conf') should include_class('github::ksplice') should contain_networking__bond('bond0').with( :gateway => '172.22.0.2', :arp_ip_target => '172.22.0.2', :up_commands => nil ) We use rspec-puppet heavily. If you haven’t used rspec-puppet yet, go check it out right now. It’s amazing. There are no less than three talks about it at Puppetconf, so I’m not going to talk about HOW to use it today, just touch a little bit on how WE use it.
  • 34.  rodjek / rspec-puppet rspec-puppet, that’s three
  • 35. role describe 'github::role::fe' do let(:title) { 'fe' } let(:node) { 'fe1.rs.github.com' } let(:params) { { specs :public_address => '207.97.227.242/27', :private_address => '172.22.1.59/22', :git_weight => '16' } } let(:facts) { are { :ipaddress => '172.22.1.59', :operatingsystem => 'Debian', :datacenter => 'rackspace-iad2', } king } it do should contain_github__core('fe') ... end end We try our best to adequately test our individual puppet modules, but our central and most frequently touched specs exercise our role system. There’s one spec for each role which describes its intended functionality. These specs focus on critical functionality of each role, and help a great deal to build confidence that we’re not introducing regressions when adding or refactoring functionality or working in other roles.
  • 36. .git/hooks/pre-commit $ git commit -am "lolbadchange" modules/github/manifests/role/fe.pp:err: Could not parse for environment production: Syntax error at 'allow_outbound_syslog'; expected '}' at /Users/jnewland/github/puppet/modules/github/ manifests/role/fe.pp:31 modules/github/manifests/role/fe.pp - WARNING: => is not properly aligned on line 626 For an even faster feedback loop than running specs, all Puppet dev environments automatically get setup with a pre-commit hook that checks for syntax errors and ensures your changes confirm to the Puppet Style guide. This has proved amazingly useful for Puppet novices and experts alike, novices finding it helps them understand language conventions quickly and guides them towards solutions, and experts using it to catch typos and help them not look like novices.
  • 37.  rodjek / puppet-lint puppet-lint, that’s four, btw.
  • 38. specs run on each push auto deploy on CI pass rspec-puppet and puppet-lint are automatically run by CI on every commit on every branch pushed to our Puppet repo. Once master passes CI, puppet is automatically deployed
  • 39. As you can see, Hubot automates a lot of the process of rolling out Puppet That example covered pushing changes to master, but what about a Pull-Request based workflow?
  • 40. Say we have a pull request for a branch we want to merge, and that we’ve reviewed the code and it all looks good.
  • 41. branches == environments On each deploy, we turn all git branches into puppet environments.
  • 42. This combined with heaven, our capistrano-powered deployment API we interact with via Hubot, enables us to experiment with unmerged Puppet branches in a powerful way
  • 43. So, to safely merge this pull request...
  • 44. hubot ci status puppet/git-gh13 deploy:apply puppet/git-gh13 staging/fs1 deploy:noop puppet/git-gh13 prod/fs1 # merge pull request hubot deploy:apply puppet to prod/fs graph me -1h @collectd.load(fs*) log me hooks github/github You might ask Hubot to confirm its build status
  • 45. Build #108816 (5fe75932f26ea62cb5fc5e3d0cb302cc2461d11e) of puppet/git-gh13 was successful(421s) github/ puppet@567ea48...5fe7593 Yup, looks good.
  • 46. hubot ci status puppet/git-gh13 deploy:apply puppet/git-gh13 staging/fs1 deploy:noop puppet/git-gh13 prod/fs1 # merge pull request hubot deploy:apply puppet to prod/fs graph me -1h @collectd.load(fs*) log me hooks github/github Then roll the branch out to a staging box to make everything applies cleanly there.
  • 47. ** [out :: REDACTED ] Bootstrapping... ** [out :: REDACTED ] Gem environment up-to-date. ** [out :: REDACTED ] Running librarian-puppet... ** [out :: REDACTED ] Generating puppet environments... ** [out :: REDACTED ] Cleaning up deleted branches... ** [out :: REDACTED ] Done! ** [out :: REDACTED ] Sending 'restart' command ** [out :: REDACTED ] The following watches were affected: ** [out :: REDACTED ] puppetmaster_unicorn ** [out :: fs1a.stg.github.com] info: Applying configuration version '8fb1a2716d5f950b836e511471a2bdac3ed27090' ** [out :: fs1a.stg.github.com] notice: /Stage[main] Github::Common_packages/Package[git]/ensure: ensure changed '1:1.7.10-1+github12' to '1:1.7.10-1+github13' ... Yup, looks good.
  • 48. hubot ci status puppet/git-gh13 deploy:apply puppet/git-gh13 staging/fs1 deploy:noop puppet/git-gh13 prod/fs1 # merge pull request hubot deploy:apply puppet to prod/fs graph me -1h @collectd.load(fs*) log me hooks github/github Then, if you wanted an extra layer of confidence, you could noop the branch against a production node
  • 49. ** [out :: REDACTED ] Bootstrapping... ** [out :: REDACTED ] Gem environment up-to-date. ** [out :: REDACTED ] Running librarian-puppet... ** [out :: REDACTED ] Generating puppet environments... ** [out :: REDACTED ] Cleaning up deleted branches... ** [out :: REDACTED ] Done! ** [out :: REDACTED ] Sending 'restart' command ** [out :: REDACTED ] The following watches were affected: ** [out :: REDACTED ] puppetmaster_unicorn ** [out :: fs1a.rs.github.com] info: Applying configuration version '8fb1a2716d5f950b836e511471a2bdac3ed27090' ** [out :: fs1a.rs.github.com] notice: /Stage[main]/ Github::Common_packages/Package[git]/ensure: would have changed from '1:1.7.10-1+github12' to '1:1.7.10-1+github13' ... Yup, looks good
  • 50. hubot ci status puppet/git-gh13 deploy:apply puppet/git-gh13 staging/fs1 deploy:noop puppet/git-gh13 prod/fs1 # merge pull request hubot deploy:apply puppet to prod/fs graph me -1h @collectd.load(fs*) log me hooks github/github Next, you’d merge the pull request. If you stopped here, the code would gradually roll out to all affected nodes over the next hour.
  • 51. hubot ci status puppet/git-gh13 deploy:apply puppet/git-gh13 staging/fs1 deploy:noop puppet/git-gh13 prod/fs1 # merge pull request hubot deploy:apply puppet to prod/fs graph me -1h @collectd.load(fs*) log me hooks github/github If you wanted the rollout to happen faster than that, you could force a puppet run on the affected class of nodes
  • 52. ** [out :: REDACTED ] Bootstrapping... ** [out :: REDACTED ] Gem environment up-to-date. ** [out :: REDACTED ] Running librarian-puppet... ** [out :: REDACTED ] Generating puppet environments... ** [out :: REDACTED ] Cleaning up deleted branches... ** [out :: REDACTED ] Done! ** [out :: REDACTED ] Sending 'restart' command ** [out :: REDACTED ] The following watches were affected: ** [out :: REDACTED ] puppetmaster_unicorn ** [out :: fs1a.rs.github.com] info: Applying configuration version '8fb1a2716d5f950b836e511471a2bdac3ed27090' ** [out :: fs7b.rs.github.com] info: Applying configuration version '8fb1a2716d5f950b836e511471a2bdac3ed27090' ** [out :: fs1a.rs.github.com] notice: /Stage[main]/ Github::Common_packages/Package[git]/ensure: ensure changed '1:1.7.10-1+github12' to '1:1.7.10-1+github13' ** [out :: fs7b.rs.github.com] notice: /Stage[main]/ Github::Common_packages/Package[git]/ensure: ensure changed '1:1.7.10-1+github12' to '1:1.7.10-1+github13' ... Yup, that looks good.
  • 53. hubot ci status puppet/git-gh13 deploy:apply puppet/git-gh13 staging/fs1 deploy:noop puppet/git-gh13 prod/fs1 # merge pull request hubot deploy:apply puppet to prod/fs graph me -1h @collectd.load(fs*) log me hooks github/github Then you’d probably want to check out load to make sure nothing went crazy
  • 55. hubot ci status puppet/git-gh13 deploy:apply puppet/git-gh13 staging/fs1 deploy:noop puppet/git-gh13 prod/fs1 # merge pull request hubot deploy:apply puppet to prod/fs graph me -1h @collectd.load(fs*) log me hooks github/github ...and maybe check some logs or other related metrics to confirm your change didn’t break something
  • 57. ChatOps How we interact with Puppet via Hubot is a great example of a core principal of how we do ops at GitHub. We’ve been calling it ChatOps recently.
  • 58. Essentially, ChatOps is the result of Hubot becoming sentient, and decreeing, among other things, that we now address him as “Supreme Leader” and communicate with our infrastructure though his secure channels alone. We occasionally observe him speaking in tongues that sound eerily like YouTube comments.
  • 59. Hubot Actually, that’s not it at all. Hubot is the star of our Ops team.
  • 60. heaven shell Hubot janky graphme We use hubot day in day out to interact with other simple tools we’ve written over JSON apis.
  • 61. ALL OF hubotshell heaven janky THE APIS graphme Hubot interacts nicely with tons of external APIs too. If you have a JSON API, making your service work with Hubot is a piece of cake.
  • 62. Why is this stupid chat bot so important to Ops? But why do we obsess about Hubot so much? It’s just a chat bot, right? There are some distinct upsides to this approach we’ve notices as our use of Hubot in Ops has grown
  • 63. hubot ci status puppet/git-gh13 deploy:apply puppet/git-gh13 staging/fs1 deploy:noop puppet/git-gh13 prod/fs1 # merge pull request hubot deploy:apply puppet to prod/fs graph me -1h @collectd.load(fs*) log me hooks github/github Remember the flow I just showed you for rolling out puppet changes to our infrastructure?
  • 64. Everyone sees all of that happen on their first day Everyone sees all of this happen from the minute they join GitHub. It’s right there, in the Ops room, right in the middle of the conversation in campfire.
  • 65. You don’t just see how to roll out puppet, you see how to...
  • 66. hubot ci status github/smoke-perf check the status of branch’s last build
  • 67. hubot deploy github/smoke-perf to prod/fe1 deploy a any branch of any github app to any server
  • 68. hubot graph me -10min @app-perf get graphs of the app’s recent performance
  • 69. hubot procs unicorn check the status of unicorns across all frontends
  • 70. hubot resque critical check the status of the resque critical queue
  • 71. hubot graph me -10min @collectd.load(fe*) check load on the frontends
  • 72. hubot conns fe1 check current connections to a frontend that you suspect has a problem
  • 73. hubot log me smoke fe1 grab smoke logs for that frontend and realize that you did, in fact, break it
  • 74. hubot lbctl disable fe1 take it out of the load balancer
  • 75. hubot status yellow Bad deploy. Reverting now. update the status blog
  • 76. hubot who’s on call determine who is currently on call so you can apologize to them
  • 77. hubot pingdom checks check pingdom to make sure you haven’t broken everything
  • 78. hubot upset me chill yourself out really quick
  • 79. hubot deploy github to prod/fe1 revert back to master on the busted frontend
  • 80. hubot log me smoke fe1 verify things have returned to normal
  • 81. hubot air drum me get pumped up because you fixed it
  • 82. hubot lbctl enable fe1 bring the fixed frontend back into the rotation
  • 83. hubot status green All systems go. clear alerts on the status page
  • 84. hubot whois 4.9.23.22 Once the outage has been resolved, you might see how to grab whois information for an IP that exhibited suspicious activity in the logs you saw
  • 85. hubot khanify spammers and how to hit meme generator to make a joke when you realize that IP is a spammer
  • 86. hubot play in the air tonight then someone would queue up the song that popped into their head when they thought about drums and gorillas at the same time
  • 87. hubot tweet@github PuppetConf Drinkup Friday night at 8:30 at Zeke’s (3rd & Brannan) and then finish it all off with a tweet about the Drinkup we’re throwing friday night
  • 88. ChatOps ChatOps means building tools that make it easier to operate your infrastructure via Hubot than via Terminal or Chrome
  • 89. By placing tools directly in the middle of the conversation Because...
  • 90. Everyone is pairing all of the time This is the core concept behind ChatOps.
  • 91. Teaching by doing Teaching by doing is awesome
  • 92. This was always my main motivation with hubot - teaching by doing by making things visible. It's an extremely powerful teaching technique - @rtomayko Ryan Tomayko had this in mind from the very first commits to hubot, which just presented a simple wrapper around a repository of shell scripts we use for management and monitoring our infrastructure.
  • 93. This is how I respond to “how to I do X” questions in Campfire now. If there’s not yet Hubot functionality to do a thing, we try to write it.
  • 94. Communicate by doing Placing tools in the middle of the conversation also means you get communication of your work for free. If you’re doing something in a shell or on a website, you have to do it, then tell people about it. If you do it with hubot, that comes free.
  • 95. THINGS I HAVEN’T ASKED RECENTLY For example, here are a few things I haven’t asked recently because Hubot has told me the answer
  • 96. THINGS I HAVEN’T ASKED how’s that deploy going? RECENTLY
  • 97. THINGS I are you deploying that or should i? HAVEN’T ASKED how’s that deploy going? RECENTLY
  • 98. THINGS I are you deploying that or should i? HAVEN’T ASKED how’s that deploy going? is anyone responding to that nagios alert? RECENTLY
  • 99. THINGS I is that branch green? are you deploying that or should i? HAVEN’T ASKED how’s that deploy going? is anyone responding to that nagios alert? RECENTLY
  • 100. THINGS I is that branch green? are you deploying that or should i? HAVEN’T ASKED how’s that deploy going? is anyone responding to that nagios alert? RECENTLY how does load look?
  • 101. did anyone update the status page? THINGS I is that branch green? are you deploying that or should i? HAVEN’T ASKED how’s that deploy going? is anyone responding to that nagios alert? RECENTLY how does load look?
  • 102. did anyone update the status page? THINGS I is that branch green? are you deploying that or should i? HAVEN’T ASKED how’s that deploy going? is anyone responding to that nagios alert? RECENTLY how does load look? did that deploy finish?
  • 103. Free communication is especially crucial in a distributed environment.
  • 104. Our Ops team is entirely remote, so Campfire is our default means of communication.
  • 105. http://www.flickr.com/photos/7997249@N06/6061305639/ This is extremely helpful during outages or other situations that require tactical response. You don’t have to SAY that you’re spraying water on the fire, people SEE you doing it.
  • 106. Hide the ugly Another awesome benefit of ChatOps-ing all of the things is that you can hide ugly interfaces and design exactly the interaction you want with some simple porcelain commands
  • 107. My favorite example of this is ugliest of the ugly, Nagios.
  • 108. [nines] hubot opened issue #4263: Nagios (229906) - fs3b/syslog - Tue Sept 25 23:40:18 PDT 2012. github/nines#4263 Hubot politely delivers nagios alerts directly into chat
  • 109. hubot nagios ack fs3b/syslog # fix stuff nagios check fs3b/syslog nagios status fs3b/syslog hubot nagios downtime fs3b/syslog 90 nagios mute fs3b/syslog nagios unmute fs3b/syslog Which we can interact with without any unnecessary eye bleeding. Making this easy means developers and other ops engineers actually mute or schedule downtime when they’re testing things.
  • 110. Mobile FTW Yet another awesome benefit of ChatOps is that you get mobile support for free
  • 111. Well, that is, if you have a team of awesome iOS developers that have built an actually functioning Campfire client for the iPhone This lets you do anything hubot can do from your phone. Which means from your couch. Or your bed. Or a beach in Hawaii. Which means you can fix a lot of things without pulling your laptop out of your bag.
  • 113. And now for something completely different While I’m showing off mobile stuff, I thought I’d slip in a demo of something else we’ve done to make Ops more mobile friendly.
  • 114. We’ve hacked together support for PagerDuty alerts via Apple Push Notifications. When you swipe on the alert, you go directly to the PagerDuty mobile UI for an incident
  • 115. Which lets you ack an alert
  • 117. or on the couch.
  • 118. Boom I can’t even begin to tell you how happy this makes me, and how less shitty it makes being on-call
  • 119. So, who better to summarize all of this than Hubot himself. I asked him what he thought about ChatOps. Here’s what he said:
  • 120. ChatOps all the things. Listen to what Hubot said. You’ll love it. Your ops team will love it. And you’ll help other developers learn how to interact with ops tools without any additional work. That’s awesome.
  • 121. Work at GitHub jesse@github.com If you can’t ChatOps all the things at your gig now, you could always just come work with me at GitHub. Shoot me an email if you’re interested.
  • 122. Thanks! That’s all I have. Thanks for listening! any questions?
  • 123. Tomorrow @ 8:30 PM Zeke’s 3rd & Brannan While I still have everyone’s attention, I wanted to mention the GitHub Drinkup we’re throwing for Puppetconf again. It’s tomorrow night at 8:30pm at Zeke’s, which is on the corner of 3rd and Brannan, everyone’s invited. I’ll see you there. Thanks again!