Application Deployment is System State


                               Joshua Timberman
                                  @jtimberman
                             joshua@opscode.com



Wednesday, February 22, 12
% whoami


Wednesday, February 22, 12
Wednesday, February 22, 12
Wednesday, February 22, 12
Who are you?




                 • Developers?
                 • System administrators?
                 • DevOps?

Wednesday, February 22, 12
System State


Wednesday, February 22, 12
Configuration Management


Wednesday, February 22, 12
System Integration


                                   http://www.flickr.com/photos/opalsson/3773629074/

Wednesday, February 22, 12
WAT?


Wednesday, February 22, 12
n-Tier Infrastructure


                                           Load Balancer




                             App Server   { {               App Server
                                                                                •
                                                                                •
                                                                                •
                                                                                    Provision
                                                                                    Configure
                                                                                    Integrate


                                          Database Master




Wednesday, February 22, 12
Wednesday, February 22, 12
We're hiring!
                             opscode.com/careers/


Wednesday, February 22, 12
Resources


Wednesday, February 22, 12
Declarative interface to
                               system resources


Wednesday, February 22, 12
user "django_app" do
                               shell "/bin/false
                               comment "Django App User"
                               system true
                               action :create
                             end

                             package "python" do
                               action :install
                             end

                             python_pip "gunicorn" do
                               action :install
                             end
Wednesday, February 22, 12
Describe *what*.

                                 Not how.

Wednesday, February 22, 12
def install_package(name, version)
         package_name = "#{name}=#{version}"
         package_name = name if @is_virtual_package
         run_command_with_systems_locale(
           :command => "apt-get -q -y
             #{expand_options(@new_resource.options)}
             install #{package_name}",
           :environment => {
             "DEBIAN_FRONTEND" => "noninteractive"
           }
         )
       end


Wednesday, February 22, 12
package “python”
                                            {   yum install python
                                                apt-get install python
                                                pacman sync python
                                                pkg_add -r python




Wednesday, February 22, 12
Recipes


Wednesday, February 22, 12
Ruby Internal Ruby DSL Ruby


Wednesday, February 22, 12
def method_missing(method_symbol, *args, &block)
                    return "lol method_missing"
                  end




Wednesday, February 22, 12
user "django_app" do
                               shell "/bin/false
                               comment "Django App"
                               system true
                             end

                             package "python"

                             python_pip "gunicorn" do
                               action :install
                             end
Wednesday, February 22, 12
Cookbooks


Wednesday, February 22, 12
opscode/cookbooks/python
                             ├── README.md
                             ├── attributes
                             │   └── default.rb
                             ├── metadata.rb
                             ├── providers
                             │   ├── pip.rb
                             │   └── virtualenv.rb
                             ├── recipes
                             │   ├── default.rb
                             │   ├── package.rb
                             │   ├── pip.rb
                             │   ├── source.rb
                             │   └── virtualenv.rb
                             └── resources
                                 ├── pip.rb
                                 └── virtualenv.rb
Wednesday, February 22, 12
Roles


Wednesday, February 22, 12
Roles describe nodes.


Wednesday, February 22, 12
name "django_cms"
         description "django app app server"
         run_list(
           "recipe[mysql::client]",
           "recipe[application]"
         )




Wednesday, February 22, 12
Roles contain recipes


Wednesday, February 22, 12
name "base"
                        description "All nodes have the base role"
                        run_list(
                          "recipe[zsh]",
                          "recipe[sudo]",
                          "recipe[apt]",
                          "recipe[git]",
                          "recipe[build-essential]"
                        )
                        override_attributes(
                          :authorization => {
                            :sudo => {
                              :users => ["ubuntu"],
                              :passwordless => true
                            }
                          }
                        )
Wednesday, February 22, 12
Application Deployment


Wednesday, February 22, 12
Wednesday, February 22, 12
Wednesday, February 22, 12
Wednesday, February 22, 12
Wednesday, February 22, 12
Wednesday, February 22, 12
Build your own




                 • Let's be realistic.
                 • You own your availability.

Wednesday, February 22, 12
Application Deployment vs...




                 • Configuration management
                 • Ad-hoc system administration
                 • Going against policy

Wednesday, February 22, 12
Wednesday, February 22, 12
Wednesday, February 22, 12
Package management



                 • Rpm
                 • Deb
                 • Pkgsrc
                 • Gems
                 • Eggs
                 • Not a solved problem.
Wednesday, February 22, 12
git "/srv/django_app" do
                 repository "git://github.com/me/django_app.git"
                 reference "master"
                 action :sync
               end




Wednesday, February 22, 12
Fabric


Wednesday, February 22, 12
Capistrano


Wednesday, February 22, 12
chef-deploy


Wednesday, February 22, 12
deploy_revision[/srv/django_app]


Wednesday, February 22, 12
deploy_revision "/srv/django_app" do
  revision "2.0.17"
  repository "git://github.com/me/django_app.git"
  user "django_app"
  group "www-data"
  before_migrate do
    requirements_file = "#{release_path}/requirements.txt"
    execute "pip install -r #{requirements_file}" do
      cwd release_path
    end
  end
  action :deploy
end


Wednesday, February 22, 12
Ad-Hoc Deployment




                 • knife ssh
                 • capistrano
                 • fabric (use pychef!)

Wednesday, February 22, 12
require 'chef/knife'
   require 'chef/search/query'

   Capistrano::Configuration.instance.load do
     Chef::Knife.new.configure_chef

     def chef_role(name, query = "*:*", options = {})
       attr = options.delete(:attribute) || :ipaddress
       nodes = Chef::Search::Query.new.search(:node, query)
   [0].map {|n| n[attr] }
       role name, *nodes, options
       nodes
     end
   end

                         https://github.com/cramerdev/capistrano-chef
Wednesday, February 22, 12
from fabric.api import env, run, roles
                             from chef.fabric import chef_roledefs

                             env.roledefs = chef_roledefs()

                             @roles('web_app')
                             def mytask():
                                 run('uptime')




             http://pychef.readthedocs.org/en/latest/fabric.html
Wednesday, February 22, 12
Further Resources



                 •      https://us.pycon.org/2012/schedule/
                        presentation/286/ (Noah Kantrowitz)
                 •      http://wiki.opscode.com/display/chef/
                        Build+a+Django+Stack
                 •      http://community.opscode.com/
                        cookbooks/application
                 •      http://pychef.readthedocs.org/en/latest/
                        index.html


Wednesday, February 22, 12
Questions?

                                Joshua Timberman
                             joshua@opscode.com
                         @jtimberman (twitter, github)
                                lists.opscode.com
                              irc.freenode.net/chef

                                                 http://www.flickr.com/photos/oberazzi/318947873/
Wednesday, February 22, 12

Socal piggies-app-deploy