SlideShare a Scribd company logo
Prepared For: Acquia
                                            October 4, 2012


                             Title: Harmonious Development:
Standardizing The Deployment Process via Vagrant and Puppet


         Achieve – Quality on Time

                                                       1
Achieve Internet Overview

   7+ years developing media and entertainment web
    properties


 Over 60,000 development hours developing Drupal web &
    mobile-optimized solutions


   Deep expertise in UX
    (theming), Globalization, Integration, and Performance


 Company commitment to
    quality, transparency, continuity, reliability and client
    experience
Key Clients: Media & Entertainment




             Media
Key Clients: Other




      Other
Pop Quiz

<?php
/**
 * Transform upper camel case to lower camel case.
 *
 * @param string $word
 * Upper camel case word.
 *
 * @return string
 * $word with first letter in lower case.
 *
 * @see http://www.php.net/manual/en/function.lcfirst.php
 */
function my_module_camel_case($word) {
  return lcfirst($word);
}

echo my_module_camel_case('HelloWorld');
Agenda




+        =
Agenda (Cont.)

   What’s all the fuss?

   What is Virtualization?

   Vagrant – Creating (and destroying) environments on the fly

   Provisioning (via Puppet)

   Examples

   Future Directions

   Q&A
What We Are Not Covering

 Performance Tuning
  These are examples only


 Version Control
  All provisioning can be placed into VCS

   Puppet vs. Chef
What’s all the fuss?

“Write once, run anywhere” -- Sun Microsystems



“Write Once, Debug Everywhere” -- Anonymous / Reality



“In many distributed computing environments, failures are
reported in a way that violates even the simplest notions of
consistency.” -- IEEE Software, Bradford Glade. K. Birman
The Good Old Days
Today….
How It Compares




Old Approach

                      Old Approach… Today
The Drupal Ecosystem
Site Building Roles
How It All Fits




     Virtual Box                         Vagrant
(Virtual Environment)           (Virtual Machine Builder)




                                                 VeeWee
                                               (Vagrant Box
                                                 Builder)
       Puppet
     (Provisioner)
Versions

 VirtualBox v4.1.18
 (https://www.virtualbox.org/wiki/Downloads)


 Vagrant v1.0.3 (http://downloads.vagrantup.com/)

 Puppet v2.7.19

 Veewee v0.3.0.beta1 (https://github.com/jedi4ever/veewee)

 Ubuntu v8.04 Hardy Heron
Virtual Box




     Virtual Box
                                          Vagrant
(Virtual Environment)
                                 (Virtual Machine Builder)




                                                   VeeWee
                                                 (Vagrant Box
                                                   Builder)
       Puppet
     (Provisioner)
What is Virtualization?
 Technical Definition….
 A logical representation of a computer in software. By decoupling the
 physical hardware from the operating system, virtualization provides
 more operational flexibility and increases the utilization rate of the
 underlying physical hardware.1

 In a Nutshell….
 Putting a small computer [guest/virtual machine] (operating system,
 memory, video display, peripherals, etc.) into the confines of another
 bigger physical system [host].
VirtualBox


 Open Source virtualization software for
 Windows, Mac, and Linux

 Can host multiple operating systems at
 once (within memory and CPU
 resources)

 Free!
Vagrant




     Virtual Box
                                       Vagrant
(Virtual Environment)
                              (Virtual Machine Builder)




                                                VeeWee
                                              (Vagrant Box
                                                Builder)
       Puppet
     (Provisioner)
Vagrant


 Manages your virtual machines
 Works with VirtualBox
 Extremely customizable
 Over 50+ pre-built base boxes
 Free!
Why Vagrant?

 Creates consistent, reproducible environments
 Rapid setup – Start development in a few quick steps
 Reduce duplicated effort
 Increased reliability
 Allows you to tinker around, more on this later…
 Cost savings!
Agenda - Revisited

 What’s all the fuss?
 What is Virtualization?
 Vagrant – Creating (and destroying)
 environments on the fly.
 Provisioning (via Puppet)
 Examples
 Future Directions
Q&A
Using Vagrant
Objective:
Part 1: Create a Ubuntu 8.04 LTS Virtual Machine (VM)

One Time Steps:
List available boxes:
$ vagrant box list

Add a new Vagrant base box to inventory if not available:
(@see http://www.vagrantbox.es/)
Usage: vagrant box add <alias> <location>
$ vagrant box add hardy /path/to/hardy.box

Create a directory for your Vagrant VMs
$ mkdir <vm_dir>/myproject

Create a Vagrant file (do this in <vm_dir>/myproject)
Usage: vagrant init <alias>
$ vagrant init hardy
Using Vagrant

Let’s Rock!!

Start up a virtual machine:
$ vagrant up

Delete a virtual machine:
$ vagrant remove

Connect to virtual machine:
$ vagrant ssh


Success! Instant VM. Do the happy dance!
Using Vagrant
Other Useful Commands

Go to lunch:
$ vagrant suspend # Save state of virtual machine
$ vagrant resume # Start virtual machine up again

Reboot:
$ vagrant halt       # Shutdown the VM
$ vagrant up –no-provision # Restart VM, skip provisioning*
* = Online documentation says no reprovisioning will occur…

Reload configuration (automatically does a provisioning)
$ vagrant reload

Reprovision a system:
$ vagrant reprovision

Repackage running system:
$ vagrant package
Example 1

$ mkdir <vm_dir>/myproject
$ vagrant init hardy

Customize our VM Instance (Excerpts of Vagrantfile)
config.vm.network :hostonly, "192.168.33.10”

# Host: <vm_dir>/<project_name> == Guest: /vagrant
config.vm.share_folder "v-root", "/vagrant", ".", :owner => 'www-data', :group => 'www-
data’

# Configure the VM with puppet.
config.vm.provision :puppet, :module_path => "modules", :options => ["--
environment", "local"] do |puppet|
 puppet.manifests_path = "manifests”
 puppet.manifest_file = ”myproject.pp”
End

$ vagrant up
Example 1

Scenario: Admin for a Day

Wonder what this does… (WARNING)*

$ sudo chmod 444 /etc/sudoers

* Warning, doing this on a Production system may have an adverse effect on
your career. This will remove any ability to sudo.



Solution (Assuming all configuration is provisioned):
$ vagrant destroy
$ vagrant up
Vagrant++


 Instant development environments!


 No physical hardware required.


 Creates a safe environment for configuration optimization.
Puppet




     Virtual Box
                                      Vagrant
(Virtual Environment)
                             (Virtual Machine Builder)




                                               VeeWee
                                             (Vagrant Box
                                               Builder)
       Puppet
     (Provisioner)
Puppet



   Provisioning = preparing a device/server for usage, aka configuration


   Allows enforceable system configuration


   Similar to Microsoft’s System Center Configuration Manager/SMS or Apple’s Profile
    Manager


   Uses a Resource Abstraction Layer (RAL) to interact with the host.
    Core Resource Types include: notify, file, package, service, exec, cron, user, group


   RAL can be used to read and modify resources


   Configurations can be store in manifests. See resources for prebuilt modules.
Puppet: Miscellaneous Info

Facter: Inspects operating system “facts” that can be used in modules.
$ facter
…
 id => vagrant
interfaces => eth0,eth1,lo
ipaddress => 10.0.2.15
ipaddress_eth0 => 10.0.2.15
ipaddress_eth1 => 192.168.33.10
ipaddress_lo => 127.0.0.1
is_virtual => true
kernel => Linux
kernelmajversion => 2.6
kernelrelease => 2.6.24-26-server
kernelversion => 2.6.24
lsbdistcodename => hardy
lsbdistdescription => Ubuntu 8.04.4 LTS
lsbdistid => Ubuntu
lsbdistrelease => 8.04
lsbmajdistrelease => 8
memoryfree => 1.85 GB
memorysize => 1.98 GB
memorytotal => 1.98 GB
netmask => 255.255.255.0
netmask_lo => 255.0.0.0
network_eth0 => 10.0.2.0
network_eth1 => 192.168.33.0
network_lo => 127.0.0.0
operatingsystem => Ubuntu
operatingsystemrelease => 8.04
…
Puppet: Miscellaneous Info (Cont.)

Describes a resource, use -s to summarize
$ puppet describe <resource>

Inspect individual resource in “Puppet-speak”
$ puppet resource service apache2
service { 'apache2':
  ensure => 'stopped',
  enable => 'true',
}

Test a manifest on the local system
$ puppet apply --modulepath=<module_path> <manifest>.pp
Agenda - Revisited

 What’s all the fuss?
 What is Virtualization?
 Vagrant – Creating (and destroying)
 environments on the fly.
 Provisioning (via Puppet)
 Examples
 Future Directions
Q&A
Puppet: Important Notes


Common Pattern:
Package, File, Service


Resources are processed asynchronously! Use dependency
relationships (require/before) if any ordering is necessary.


@see http://forge.puppetlabs.com/ for prebuilt Puppet
modules.
Puppet Main Manifest
myproject.pp
class myproject {
                                     Site specific          ensure => 'absent';
 $site = ’myproject'                                       $site:
                                                            ensure => 'present';             Site/DB
 # Vagrant specific setup, set up hostname, hosts file    }
 class { 'vagrant':                                       apache::mod {
   site => $site,                                           'rewrite': ensure => 'present'
 }                                                        }

 # Cool stuff                                             mysql::schema { $site:
 class { 'vim': }                                           user => $site,
                                                            password => $site,
 # LAMP stack                                             }
 class { 'linux': }
 class { 'apache': }                 Base LAMP            class { 'drupal::prepare':
 class { 'mysql': }                                          site => $site,
 class { 'php':                                              admin_pw => 'admin',
   error_reporting => 'E_ALL & ~(E_WARNING|E_NOTICE)',     }
 }                                                       }
 class { 'phpmyadmin': }
                                                         class { 'myproject': }
 # Drupal
 class { 'drupal':
   server_type => 'dev',
 }

 # Solr
 class { 'tomcat': }
 class { 'solr': }                   Search
 # Site specific stuff
 apache::site {
  'default':
    vhost => 'default',
Example 2: Puppet Module
/modules/apache/init.pp (Header)
# Class: apache                                                              # vhost => 'default',
#                                                                            # ensure => 'absent';
# This module installs apache and sets up the virtual.
#
                                                                             # '<site_name_1>':
                                                                             # ensure => 'present';             Advanced usage
# Mike Lee <michael.lee@achieveinternet.com>                                 # '<site_name_2>':
# 2012-09-07
#
                                                                             # docroot => '/custom/path',
                                                                             # ensure => 'present';
                                                                                                                Enable host/mod
# Tested platforms:                                                          #}
# - Ubuntu 8.04 Hardy Heron                                                  #
#                                                                            # Enable/disable modules.
# Parameters:                                                                # apache::mod {
# N/A                                                                        # 'rewrite': ensure => 'present’
#                                                                            #}
# Actions:
# Installs and configures apache. Will automatically create the site file.
#
# Requires:
# N/A
#
# Sample Usage:
#
# Make sure apache is present.
# class { 'apache': }
#                                            Base usage
# Enable/disable sites.
# <site_name> = Simple site name. The vagrant domain will be added
automatically.
# i.e. <site_name> = "example" creates a site named "example.vagrant".
# <docroot> = Docroot. Defaults to /vagrant/<site_name>/docroot.
# If this is overridden, this must be the ABSOLUTE path to the docroot.
#
# apache::site {
# 'default':
Puppet Sample Module
/modules/apache/init.pp (Code)
class apache {                                                             case $ensure {
 $apache2_sites = '/etc/apache2/sites'                                        present: {
 $apache2_mods = '/etc/apache2/mods'                                           file { "/etc/apache2/sites-available/$site_name":
                                                                                 ensure => file,
 # OS Specific settings
 case $::operatingsystem {                  OS Specific                          require => Package[$apache::package_name],
                                                                                 content => template("apache/${apache::conf_template}"),
   ubuntu: {                                                                   }
     $package_name = 'apache2'
     $conf_template = 'site.conf.debian.erb'                                    exec { "/usr/sbin/a2ensite $site_name":
   }                                                                              unless => "/bin/readlink -e ${apache2_sites}-enabled/$site_name",
   default: {                                                                     notify => Exec['force-reload-apache'],
     notify { "${module_name}_unsupported":                                       require => Package[$apache::package_name],
       message => "The ${module_name} module is not supported on                }
${::operatingsystem}.",                                                         }
     }                                                                          absent: {
     error("OS support for ${::operatingsystem} needs to be configured")          exec { "/usr/sbin/a2dissite $site_name":
   }                                                                                #onlyif => "/bin/readlink -e ${apache2_sites}-enabled/$site_name", #
 }                                                                         readlink not returning 0

 # Define new type: site
                                    Define type: site                               notify => Exec['force-reload-apache'],
                                                                                    require => Package[$apache::package_name],
 define site ($ensure = 'present', $vhost = undef, $docroot = undef) {            }
  if $vhost {                                                                   }
    $site_name = $vhost                                                         default: {
  }                                                                               err("Unknown ensure value: '$ensure'")
  else {                                                                        }
    $site_name = "${title}.vagrant"                                           }
  }                                                                         }

  if $docroot {
    $path = $docroot
  }
  else {
    $path = "/vagrant/${title}/docroot"
  }
Puppet Sample Module
/modules/apache/init.pp (Code)
 # Define new type: mod
 define mod ($ensure = 'present') {                                                   service { $package_name:
   case $ensure {
     present: {
                                                                                        ensure => running,
                                                                                        hasstatus => true,
                                                                                                                       Package/Service
       exec { "/usr/sbin/a2enmod $title":                                               hasrestart => true,
         unless => "/bin/readlink -e ${apache2_mods}-enabled/${title}.load",            require => Package[$package_name],
         notify => Exec['force-reload-apache'],                                       }
         require => Package[$apache::package_name],                               }
       }
     }
     absent: {
                               Define type: mod
       exec { "/usr/sbin/a2dismod $title":
         #onlyif => "/bin/readlink -e ${apache2_mods}-enabled/${title}.load", #
readlink not returning 0
         notify => Exec['force-reload-apache'],
         require => Package[$apache::package_name],
       }
     }
     default: {
       err("Unknown ensure value: '$ensure'")
     }
   }
 }

 # Force reload all the time, doesn't take that much more in resources.
 exec { 'force-reload-apache':
   command => '/etc/init.d/apache2 force-reload',
   refreshonly => true,
 }

 package { $package_name:
   ensure => installed,
 }
Puppet Sample Module
ERB Templates: Create files on the fly.
/modules/apache/templates/site.conf.debian.erb

# Puppet generated file. DO NOT EDIT!
# Managed by Class['apache']

<VirtualHost *:80>
 ServerAdmin webmaster@achieveinternet.com

 DocumentRoot <%= path %>
 ServerName <%= site_name %>

 <Directory <%= path %>>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
 </Directory>
</VirtualHost>
Puppet++

 Construct fully functioning development environments on
 the fly!


 Bring new team members up to speed in a few simple
 commands.


 CONSISTENCY! CONSISTENCY! CONSISTENCY!
 Everyone is working with the same virtual machine.
Agenda - Revisited

 What’s all the fuss?
 What is Virtualization?
 Vagrant – Creating (and destroying)
 environments on the fly.
 Provisioning (via Puppet)
 Examples
 Future Directions
Q&A
Veewee




     Virtual Box
                                      Vagrant
(Virtual Environment)
                             (Virtual Machine Builder)




                                               VeeWee
                                             (Vagrant Box
                                               Builder)
       Puppet
     (Provisioner)
Next Steps: Veewee

Want your own custom Vagrant Box or one doesn’t exist?

Veewee has predefined definitions for creating a variety of Vagrant base boxes.

Installation Requirements (Mac OS X)
- Install RVM (Ruby Version Manager)
   $ curl -L https://get.rvm.io | bash -s stable

-   Install Xcode, Command Line Tools for Xcode (required by Homebrew)

-   Install Homebrew
    $ ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)

-   Install apple-gcc42 GCC Required!
      $ brew update
     $ brew tap homebrew/dupes
     $ brew install autoconf automake apple-gcc42
     $ rvm pkg install openssl
Next Steps: Veewee

Veewee Installation (Mac OS X)

$ rvm install 1.9.2
$ git clone https://github.com/jedi4ever/veewee.git
$ cd veewee

(official – Never worked for me…)
$ gem install bundler
$ bundle install

(unoffical)
$ gem build veewee.gemspec
$ gem install veewee-*.gem (run as sudo)
$ unalias veewee
Next Steps: Veewee
Veewee Base Box Creation (Mac OS X)

In veewee directory:
- Copy new iso into [currentDir]/iso   (optional, saves veewee from finding)

Create VM definition off of template:
Usage: veewee vbox define <box_name> <template>
$ veewee vbox define hardy ubuntu-8.04.4-server-i386

Customize VM Definition:
- Edit <veewee_dir>/definitions/<box_name>/definition.rb

Build virtual box (This should start VirtualBox)
Usage: veewee build <box_name>
$ veewee vbox build hardy # go get a coffee

Usage: veewee vbox validate <box_name>
$ veewee vbox validate hardy

Build Vagrant base box:
Usage: vagrant basebox export <box_name>
$ vagrant basebox export hardy
Next Steps: Puppet Enterprise


 Allow for remote management of puppet nodes.

  “One server to rule them all.”

 Clone your configurations to EC2.

 Audit your configurations.
Gotchas

 Be mindful of Puppets asyncronous execution order:
  Make sure dependecies are properly set.
 Starbucks syndrome:
  Switching networks can sometimes cause your VM’s networking to
   get confused. Halt and restart to correct.

 Provision everything… or as much as you can:
  This will make resetting your environment go much more smoothly.
Versions

 VirtualBox v4.1.18
 (https://www.virtualbox.org/wiki/Downloads)


 Vagrant v1.0.3 (http://downloads.vagrantup.com/)

 Puppet v2.7.19

 Veewee v0.3.0.beta1 (https://github.com/jedi4ever/veewee)

 Ubuntu v8.04 Hardy Heron
Further Resources


 Prebulit Vagrant Base Boxes (http://www.vagrantbox.es/)


 Puppet Forge (http://forge.puppetlabs.com/)


 Learn Puppet (http://docs.puppetlabs.com/learning/ral.html)
Conclusion
   …makes the "works on my machine" excuse a relic of the past. -- Vagrant


   Created a disposable test bed to play with configuration changes


   Created reusable modules to easily build customized setups


   Provided canned environment for those who simply want to jump into a project. Allows
    team members to focus on core competencies.


   Allows you to quickly and efficiently archive projects and come back to them later

                        CONSISTENCY - REDUCED ERRORS
                                EASY & INEXPENSIVE
                       INSTANT DEVELOPMENT              - SAVE $$$
Achieve Internet Pillars of Expertise

                  Technical Foundation Built On the
                  Following Core Areas of Expertise
                  and Knowledge:


                  1. User Experience (UX) / Theming


                  2. Globalization/Localization


                  3. Performance & Deployment


                  4. Integration
QA
Thank You
        Michael Lee
       Senior Architect
michael.lee@achieveinternet.com
    www.achieveinternet.com
           mlee11111
         @ach_mikelee
   /pub/michael-lee/4/297/a6b
      Direct: 858-453-5760

More Related Content

What's hot (18)

PPTX
Software Defined Datacenter
NETWAYS
 
KEY
Puppet for Java developers - JavaZone NO 2012
Carlos Sanchez
 
PPTX
Installaling Puppet Master and Agent
Ranjit Avasarala
 
PDF
A Hands-on Introduction to Docker
CodeOps Technologies LLP
 
PDF
Using Containers for Continuous Integration and Continuous Delivery
Carlos Sanchez
 
PDF
Using Containers for Continuous Integration and Continuous Delivery. KubeCon ...
Carlos Sanchez
 
PDF
Docker by Example - Basics
CodeOps Technologies LLP
 
PDF
Continuous Delivery: The Next Frontier
Carlos Sanchez
 
PDF
Preparation study of_docker - (MOSG)
Soshi Nemoto
 
PDF
Docker by Example - Quiz
CodeOps Technologies LLP
 
PDF
Vagrant for real codemotion (moar tips! ;-))
Michele Orselli
 
PDF
Vagrant for real (codemotion rome 2016)
Michele Orselli
 
PDF
Streamline your development environment with docker
Giacomo Bagnoli
 
PDF
Ship your Scala code often and easy with Docker
Marcus Lönnberg
 
PPTX
ABCs of docker
Sabyrzhan Tynybayev
 
PDF
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
Carlos Sanchez
 
PDF
Using Kubernetes for Continuous Integration and Continuous Delivery. Java2days
Carlos Sanchez
 
PDF
Create your very own Development Environment with Vagrant and Packer
frastel
 
Software Defined Datacenter
NETWAYS
 
Puppet for Java developers - JavaZone NO 2012
Carlos Sanchez
 
Installaling Puppet Master and Agent
Ranjit Avasarala
 
A Hands-on Introduction to Docker
CodeOps Technologies LLP
 
Using Containers for Continuous Integration and Continuous Delivery
Carlos Sanchez
 
Using Containers for Continuous Integration and Continuous Delivery. KubeCon ...
Carlos Sanchez
 
Docker by Example - Basics
CodeOps Technologies LLP
 
Continuous Delivery: The Next Frontier
Carlos Sanchez
 
Preparation study of_docker - (MOSG)
Soshi Nemoto
 
Docker by Example - Quiz
CodeOps Technologies LLP
 
Vagrant for real codemotion (moar tips! ;-))
Michele Orselli
 
Vagrant for real (codemotion rome 2016)
Michele Orselli
 
Streamline your development environment with docker
Giacomo Bagnoli
 
Ship your Scala code often and easy with Docker
Marcus Lönnberg
 
ABCs of docker
Sabyrzhan Tynybayev
 
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
Carlos Sanchez
 
Using Kubernetes for Continuous Integration and Continuous Delivery. Java2days
Carlos Sanchez
 
Create your very own Development Environment with Vagrant and Packer
frastel
 

Similar to Harmonious Development: Standardizing The Deployment Process via Vagrant and Puppet (20)

PPTX
Harmonious Development: Via Vagrant and Puppet
Achieve Internet
 
PDF
Instant LAMP Stack with Vagrant and Puppet
Patrick Lee
 
PDF
Puppet and Vagrant in development
Adam Culp
 
PDF
Local development environment through virtualisation
Radu Barbu
 
PPTX
Development with Vagrant
John Coggeshall
 
PDF
Virtualization with Vagrant (ua.pycon 2011)
Dmitry Guyvoronsky
 
PDF
Developing locally with virtual machines
whurleyf1
 
PDF
Vagrant-Binding JUG Dortmund
Hendrik Ebbers
 
PDF
Security Testing Using Infrastructure-As-Code
Vision Concepts Infrastructure Services Solution
 
PPTX
Virtualization for Developers
John Coggeshall
 
PPTX
Virtualization for Developers
John Coggeshall
 
PPTX
Virtualization for Developers
John Coggeshall
 
PDF
Using Vagrant, Puppet, Testing & Hadoop
Puppet
 
PDF
PuppetCamp SEA 1 - Using Vagrant, Puppet, Testing & Hadoop
OlinData
 
PDF
PuppetCamp SEA 1 - Using Vagrant, Puppet, Testing & Hadoop
Walter Heck
 
PDF
Powering Development and Testing Environments with Vagrant
Coen Jacobs
 
PDF
Keep calm and vagrant up
Daniel Carvalhinho
 
PPTX
Vagrant
Akshay Siwal
 
PDF
The future of the php development environment
Jeremy Quinton
 
PDF
Vagrant for Virtualized Development
Adam Culp
 
Harmonious Development: Via Vagrant and Puppet
Achieve Internet
 
Instant LAMP Stack with Vagrant and Puppet
Patrick Lee
 
Puppet and Vagrant in development
Adam Culp
 
Local development environment through virtualisation
Radu Barbu
 
Development with Vagrant
John Coggeshall
 
Virtualization with Vagrant (ua.pycon 2011)
Dmitry Guyvoronsky
 
Developing locally with virtual machines
whurleyf1
 
Vagrant-Binding JUG Dortmund
Hendrik Ebbers
 
Security Testing Using Infrastructure-As-Code
Vision Concepts Infrastructure Services Solution
 
Virtualization for Developers
John Coggeshall
 
Virtualization for Developers
John Coggeshall
 
Virtualization for Developers
John Coggeshall
 
Using Vagrant, Puppet, Testing & Hadoop
Puppet
 
PuppetCamp SEA 1 - Using Vagrant, Puppet, Testing & Hadoop
OlinData
 
PuppetCamp SEA 1 - Using Vagrant, Puppet, Testing & Hadoop
Walter Heck
 
Powering Development and Testing Environments with Vagrant
Coen Jacobs
 
Keep calm and vagrant up
Daniel Carvalhinho
 
Vagrant
Akshay Siwal
 
The future of the php development environment
Jeremy Quinton
 
Vagrant for Virtualized Development
Adam Culp
 
Ad

More from Acquia (20)

PDF
Acquia_Adcetera Webinar_Marketing Automation.pdf
Acquia
 
PDF
Acquia Webinar Deck - 9_13 .pdf
Acquia
 
PDF
Taking Your Multi-Site Management at Scale to the Next Level
Acquia
 
PDF
CDP for Retail Webinar with Appnovation - Q2 2022.pdf
Acquia
 
PDF
May Partner Bootcamp 2022
Acquia
 
PDF
April Partner Bootcamp 2022
Acquia
 
PDF
How to Unify Brand Experience: A Hootsuite Story
Acquia
 
PDF
Using Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CX
Acquia
 
PDF
Improve Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Acquia
 
PDF
September Partner Bootcamp
Acquia
 
PDF
August partner bootcamp
Acquia
 
PDF
July 2021 Partner Bootcamp
Acquia
 
PDF
May Partner Bootcamp
Acquia
 
PDF
DRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASY
Acquia
 
PDF
Work While You Sleep: The CMO’s Guide to a 24/7/365 Lead Machine
Acquia
 
PDF
Acquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B Leads
Acquia
 
PDF
April partner bootcamp deck cookieless future
Acquia
 
PDF
How to enhance cx through personalised, automated solutions
Acquia
 
PDF
DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...
Acquia
 
PDF
Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021
Acquia
 
Acquia_Adcetera Webinar_Marketing Automation.pdf
Acquia
 
Acquia Webinar Deck - 9_13 .pdf
Acquia
 
Taking Your Multi-Site Management at Scale to the Next Level
Acquia
 
CDP for Retail Webinar with Appnovation - Q2 2022.pdf
Acquia
 
May Partner Bootcamp 2022
Acquia
 
April Partner Bootcamp 2022
Acquia
 
How to Unify Brand Experience: A Hootsuite Story
Acquia
 
Using Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CX
Acquia
 
Improve Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Acquia
 
September Partner Bootcamp
Acquia
 
August partner bootcamp
Acquia
 
July 2021 Partner Bootcamp
Acquia
 
May Partner Bootcamp
Acquia
 
DRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASY
Acquia
 
Work While You Sleep: The CMO’s Guide to a 24/7/365 Lead Machine
Acquia
 
Acquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B Leads
Acquia
 
April partner bootcamp deck cookieless future
Acquia
 
How to enhance cx through personalised, automated solutions
Acquia
 
DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...
Acquia
 
Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021
Acquia
 
Ad

Harmonious Development: Standardizing The Deployment Process via Vagrant and Puppet

  • 1. Prepared For: Acquia October 4, 2012 Title: Harmonious Development: Standardizing The Deployment Process via Vagrant and Puppet Achieve – Quality on Time 1
  • 2. Achieve Internet Overview  7+ years developing media and entertainment web properties  Over 60,000 development hours developing Drupal web & mobile-optimized solutions  Deep expertise in UX (theming), Globalization, Integration, and Performance  Company commitment to quality, transparency, continuity, reliability and client experience
  • 3. Key Clients: Media & Entertainment Media
  • 5. Pop Quiz <?php /** * Transform upper camel case to lower camel case. * * @param string $word * Upper camel case word. * * @return string * $word with first letter in lower case. * * @see http://www.php.net/manual/en/function.lcfirst.php */ function my_module_camel_case($word) { return lcfirst($word); } echo my_module_camel_case('HelloWorld');
  • 7. Agenda (Cont.)  What’s all the fuss?  What is Virtualization?  Vagrant – Creating (and destroying) environments on the fly  Provisioning (via Puppet)  Examples  Future Directions  Q&A
  • 8. What We Are Not Covering  Performance Tuning  These are examples only  Version Control  All provisioning can be placed into VCS  Puppet vs. Chef
  • 9. What’s all the fuss? “Write once, run anywhere” -- Sun Microsystems “Write Once, Debug Everywhere” -- Anonymous / Reality “In many distributed computing environments, failures are reported in a way that violates even the simplest notions of consistency.” -- IEEE Software, Bradford Glade. K. Birman
  • 10. The Good Old Days
  • 12. How It Compares Old Approach Old Approach… Today
  • 15. How It All Fits Virtual Box Vagrant (Virtual Environment) (Virtual Machine Builder) VeeWee (Vagrant Box Builder) Puppet (Provisioner)
  • 16. Versions  VirtualBox v4.1.18 (https://www.virtualbox.org/wiki/Downloads)  Vagrant v1.0.3 (http://downloads.vagrantup.com/)  Puppet v2.7.19  Veewee v0.3.0.beta1 (https://github.com/jedi4ever/veewee)  Ubuntu v8.04 Hardy Heron
  • 17. Virtual Box Virtual Box Vagrant (Virtual Environment) (Virtual Machine Builder) VeeWee (Vagrant Box Builder) Puppet (Provisioner)
  • 18. What is Virtualization?  Technical Definition….  A logical representation of a computer in software. By decoupling the physical hardware from the operating system, virtualization provides more operational flexibility and increases the utilization rate of the underlying physical hardware.1  In a Nutshell….  Putting a small computer [guest/virtual machine] (operating system, memory, video display, peripherals, etc.) into the confines of another bigger physical system [host].
  • 19. VirtualBox  Open Source virtualization software for Windows, Mac, and Linux  Can host multiple operating systems at once (within memory and CPU resources)  Free!
  • 20. Vagrant Virtual Box Vagrant (Virtual Environment) (Virtual Machine Builder) VeeWee (Vagrant Box Builder) Puppet (Provisioner)
  • 21. Vagrant  Manages your virtual machines  Works with VirtualBox  Extremely customizable  Over 50+ pre-built base boxes  Free!
  • 22. Why Vagrant?  Creates consistent, reproducible environments  Rapid setup – Start development in a few quick steps  Reduce duplicated effort  Increased reliability  Allows you to tinker around, more on this later…  Cost savings!
  • 23. Agenda - Revisited  What’s all the fuss?  What is Virtualization?  Vagrant – Creating (and destroying) environments on the fly.  Provisioning (via Puppet)  Examples  Future Directions Q&A
  • 24. Using Vagrant Objective: Part 1: Create a Ubuntu 8.04 LTS Virtual Machine (VM) One Time Steps: List available boxes: $ vagrant box list Add a new Vagrant base box to inventory if not available: (@see http://www.vagrantbox.es/) Usage: vagrant box add <alias> <location> $ vagrant box add hardy /path/to/hardy.box Create a directory for your Vagrant VMs $ mkdir <vm_dir>/myproject Create a Vagrant file (do this in <vm_dir>/myproject) Usage: vagrant init <alias> $ vagrant init hardy
  • 25. Using Vagrant Let’s Rock!! Start up a virtual machine: $ vagrant up Delete a virtual machine: $ vagrant remove Connect to virtual machine: $ vagrant ssh Success! Instant VM. Do the happy dance!
  • 26. Using Vagrant Other Useful Commands Go to lunch: $ vagrant suspend # Save state of virtual machine $ vagrant resume # Start virtual machine up again Reboot: $ vagrant halt # Shutdown the VM $ vagrant up –no-provision # Restart VM, skip provisioning* * = Online documentation says no reprovisioning will occur… Reload configuration (automatically does a provisioning) $ vagrant reload Reprovision a system: $ vagrant reprovision Repackage running system: $ vagrant package
  • 27. Example 1 $ mkdir <vm_dir>/myproject $ vagrant init hardy Customize our VM Instance (Excerpts of Vagrantfile) config.vm.network :hostonly, "192.168.33.10” # Host: <vm_dir>/<project_name> == Guest: /vagrant config.vm.share_folder "v-root", "/vagrant", ".", :owner => 'www-data', :group => 'www- data’ # Configure the VM with puppet. config.vm.provision :puppet, :module_path => "modules", :options => ["-- environment", "local"] do |puppet| puppet.manifests_path = "manifests” puppet.manifest_file = ”myproject.pp” End $ vagrant up
  • 28. Example 1 Scenario: Admin for a Day Wonder what this does… (WARNING)* $ sudo chmod 444 /etc/sudoers * Warning, doing this on a Production system may have an adverse effect on your career. This will remove any ability to sudo. Solution (Assuming all configuration is provisioned): $ vagrant destroy $ vagrant up
  • 29. Vagrant++  Instant development environments!  No physical hardware required.  Creates a safe environment for configuration optimization.
  • 30. Puppet Virtual Box Vagrant (Virtual Environment) (Virtual Machine Builder) VeeWee (Vagrant Box Builder) Puppet (Provisioner)
  • 31. Puppet  Provisioning = preparing a device/server for usage, aka configuration  Allows enforceable system configuration  Similar to Microsoft’s System Center Configuration Manager/SMS or Apple’s Profile Manager  Uses a Resource Abstraction Layer (RAL) to interact with the host. Core Resource Types include: notify, file, package, service, exec, cron, user, group  RAL can be used to read and modify resources  Configurations can be store in manifests. See resources for prebuilt modules.
  • 32. Puppet: Miscellaneous Info Facter: Inspects operating system “facts” that can be used in modules. $ facter … id => vagrant interfaces => eth0,eth1,lo ipaddress => 10.0.2.15 ipaddress_eth0 => 10.0.2.15 ipaddress_eth1 => 192.168.33.10 ipaddress_lo => 127.0.0.1 is_virtual => true kernel => Linux kernelmajversion => 2.6 kernelrelease => 2.6.24-26-server kernelversion => 2.6.24 lsbdistcodename => hardy lsbdistdescription => Ubuntu 8.04.4 LTS lsbdistid => Ubuntu lsbdistrelease => 8.04 lsbmajdistrelease => 8 memoryfree => 1.85 GB memorysize => 1.98 GB memorytotal => 1.98 GB netmask => 255.255.255.0 netmask_lo => 255.0.0.0 network_eth0 => 10.0.2.0 network_eth1 => 192.168.33.0 network_lo => 127.0.0.0 operatingsystem => Ubuntu operatingsystemrelease => 8.04 …
  • 33. Puppet: Miscellaneous Info (Cont.) Describes a resource, use -s to summarize $ puppet describe <resource> Inspect individual resource in “Puppet-speak” $ puppet resource service apache2 service { 'apache2': ensure => 'stopped', enable => 'true', } Test a manifest on the local system $ puppet apply --modulepath=<module_path> <manifest>.pp
  • 34. Agenda - Revisited  What’s all the fuss?  What is Virtualization?  Vagrant – Creating (and destroying) environments on the fly.  Provisioning (via Puppet)  Examples  Future Directions Q&A
  • 35. Puppet: Important Notes Common Pattern: Package, File, Service Resources are processed asynchronously! Use dependency relationships (require/before) if any ordering is necessary. @see http://forge.puppetlabs.com/ for prebuilt Puppet modules.
  • 36. Puppet Main Manifest myproject.pp class myproject { Site specific ensure => 'absent'; $site = ’myproject' $site: ensure => 'present'; Site/DB # Vagrant specific setup, set up hostname, hosts file } class { 'vagrant': apache::mod { site => $site, 'rewrite': ensure => 'present' } } # Cool stuff mysql::schema { $site: class { 'vim': } user => $site, password => $site, # LAMP stack } class { 'linux': } class { 'apache': } Base LAMP class { 'drupal::prepare': class { 'mysql': } site => $site, class { 'php': admin_pw => 'admin', error_reporting => 'E_ALL & ~(E_WARNING|E_NOTICE)', } } } class { 'phpmyadmin': } class { 'myproject': } # Drupal class { 'drupal': server_type => 'dev', } # Solr class { 'tomcat': } class { 'solr': } Search # Site specific stuff apache::site { 'default': vhost => 'default',
  • 37. Example 2: Puppet Module /modules/apache/init.pp (Header) # Class: apache # vhost => 'default', # # ensure => 'absent'; # This module installs apache and sets up the virtual. # # '<site_name_1>': # ensure => 'present'; Advanced usage # Mike Lee <[email protected]> # '<site_name_2>': # 2012-09-07 # # docroot => '/custom/path', # ensure => 'present'; Enable host/mod # Tested platforms: #} # - Ubuntu 8.04 Hardy Heron # # # Enable/disable modules. # Parameters: # apache::mod { # N/A # 'rewrite': ensure => 'present’ # #} # Actions: # Installs and configures apache. Will automatically create the site file. # # Requires: # N/A # # Sample Usage: # # Make sure apache is present. # class { 'apache': } # Base usage # Enable/disable sites. # <site_name> = Simple site name. The vagrant domain will be added automatically. # i.e. <site_name> = "example" creates a site named "example.vagrant". # <docroot> = Docroot. Defaults to /vagrant/<site_name>/docroot. # If this is overridden, this must be the ABSOLUTE path to the docroot. # # apache::site { # 'default':
  • 38. Puppet Sample Module /modules/apache/init.pp (Code) class apache { case $ensure { $apache2_sites = '/etc/apache2/sites' present: { $apache2_mods = '/etc/apache2/mods' file { "/etc/apache2/sites-available/$site_name": ensure => file, # OS Specific settings case $::operatingsystem { OS Specific require => Package[$apache::package_name], content => template("apache/${apache::conf_template}"), ubuntu: { } $package_name = 'apache2' $conf_template = 'site.conf.debian.erb' exec { "/usr/sbin/a2ensite $site_name": } unless => "/bin/readlink -e ${apache2_sites}-enabled/$site_name", default: { notify => Exec['force-reload-apache'], notify { "${module_name}_unsupported": require => Package[$apache::package_name], message => "The ${module_name} module is not supported on } ${::operatingsystem}.", } } absent: { error("OS support for ${::operatingsystem} needs to be configured") exec { "/usr/sbin/a2dissite $site_name": } #onlyif => "/bin/readlink -e ${apache2_sites}-enabled/$site_name", # } readlink not returning 0 # Define new type: site Define type: site notify => Exec['force-reload-apache'], require => Package[$apache::package_name], define site ($ensure = 'present', $vhost = undef, $docroot = undef) { } if $vhost { } $site_name = $vhost default: { } err("Unknown ensure value: '$ensure'") else { } $site_name = "${title}.vagrant" } } } if $docroot { $path = $docroot } else { $path = "/vagrant/${title}/docroot" }
  • 39. Puppet Sample Module /modules/apache/init.pp (Code) # Define new type: mod define mod ($ensure = 'present') { service { $package_name: case $ensure { present: { ensure => running, hasstatus => true, Package/Service exec { "/usr/sbin/a2enmod $title": hasrestart => true, unless => "/bin/readlink -e ${apache2_mods}-enabled/${title}.load", require => Package[$package_name], notify => Exec['force-reload-apache'], } require => Package[$apache::package_name], } } } absent: { Define type: mod exec { "/usr/sbin/a2dismod $title": #onlyif => "/bin/readlink -e ${apache2_mods}-enabled/${title}.load", # readlink not returning 0 notify => Exec['force-reload-apache'], require => Package[$apache::package_name], } } default: { err("Unknown ensure value: '$ensure'") } } } # Force reload all the time, doesn't take that much more in resources. exec { 'force-reload-apache': command => '/etc/init.d/apache2 force-reload', refreshonly => true, } package { $package_name: ensure => installed, }
  • 40. Puppet Sample Module ERB Templates: Create files on the fly. /modules/apache/templates/site.conf.debian.erb # Puppet generated file. DO NOT EDIT! # Managed by Class['apache'] <VirtualHost *:80> ServerAdmin [email protected] DocumentRoot <%= path %> ServerName <%= site_name %> <Directory <%= path %>> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> </VirtualHost>
  • 41. Puppet++  Construct fully functioning development environments on the fly!  Bring new team members up to speed in a few simple commands.  CONSISTENCY! CONSISTENCY! CONSISTENCY! Everyone is working with the same virtual machine.
  • 42. Agenda - Revisited  What’s all the fuss?  What is Virtualization?  Vagrant – Creating (and destroying) environments on the fly.  Provisioning (via Puppet)  Examples  Future Directions Q&A
  • 43. Veewee Virtual Box Vagrant (Virtual Environment) (Virtual Machine Builder) VeeWee (Vagrant Box Builder) Puppet (Provisioner)
  • 44. Next Steps: Veewee Want your own custom Vagrant Box or one doesn’t exist? Veewee has predefined definitions for creating a variety of Vagrant base boxes. Installation Requirements (Mac OS X) - Install RVM (Ruby Version Manager) $ curl -L https://get.rvm.io | bash -s stable - Install Xcode, Command Line Tools for Xcode (required by Homebrew) - Install Homebrew $ ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go) - Install apple-gcc42 GCC Required! $ brew update $ brew tap homebrew/dupes $ brew install autoconf automake apple-gcc42 $ rvm pkg install openssl
  • 45. Next Steps: Veewee Veewee Installation (Mac OS X) $ rvm install 1.9.2 $ git clone https://github.com/jedi4ever/veewee.git $ cd veewee (official – Never worked for me…) $ gem install bundler $ bundle install (unoffical) $ gem build veewee.gemspec $ gem install veewee-*.gem (run as sudo) $ unalias veewee
  • 46. Next Steps: Veewee Veewee Base Box Creation (Mac OS X) In veewee directory: - Copy new iso into [currentDir]/iso (optional, saves veewee from finding) Create VM definition off of template: Usage: veewee vbox define <box_name> <template> $ veewee vbox define hardy ubuntu-8.04.4-server-i386 Customize VM Definition: - Edit <veewee_dir>/definitions/<box_name>/definition.rb Build virtual box (This should start VirtualBox) Usage: veewee build <box_name> $ veewee vbox build hardy # go get a coffee Usage: veewee vbox validate <box_name> $ veewee vbox validate hardy Build Vagrant base box: Usage: vagrant basebox export <box_name> $ vagrant basebox export hardy
  • 47. Next Steps: Puppet Enterprise  Allow for remote management of puppet nodes.  “One server to rule them all.”  Clone your configurations to EC2.  Audit your configurations.
  • 48. Gotchas  Be mindful of Puppets asyncronous execution order:  Make sure dependecies are properly set.  Starbucks syndrome:  Switching networks can sometimes cause your VM’s networking to get confused. Halt and restart to correct.  Provision everything… or as much as you can:  This will make resetting your environment go much more smoothly.
  • 49. Versions  VirtualBox v4.1.18 (https://www.virtualbox.org/wiki/Downloads)  Vagrant v1.0.3 (http://downloads.vagrantup.com/)  Puppet v2.7.19  Veewee v0.3.0.beta1 (https://github.com/jedi4ever/veewee)  Ubuntu v8.04 Hardy Heron
  • 50. Further Resources  Prebulit Vagrant Base Boxes (http://www.vagrantbox.es/)  Puppet Forge (http://forge.puppetlabs.com/)  Learn Puppet (http://docs.puppetlabs.com/learning/ral.html)
  • 51. Conclusion  …makes the "works on my machine" excuse a relic of the past. -- Vagrant  Created a disposable test bed to play with configuration changes  Created reusable modules to easily build customized setups  Provided canned environment for those who simply want to jump into a project. Allows team members to focus on core competencies.  Allows you to quickly and efficiently archive projects and come back to them later  CONSISTENCY - REDUCED ERRORS  EASY & INEXPENSIVE  INSTANT DEVELOPMENT - SAVE $$$
  • 52. Achieve Internet Pillars of Expertise Technical Foundation Built On the Following Core Areas of Expertise and Knowledge: 1. User Experience (UX) / Theming 2. Globalization/Localization 3. Performance & Deployment 4. Integration
  • 53. QA
  • 54. Thank You Michael Lee Senior Architect [email protected] www.achieveinternet.com mlee11111 @ach_mikelee /pub/michael-lee/4/297/a6b Direct: 858-453-5760