Vagrant & Packer
RAX Hack Night

So…

I automated *all* the things

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
So…
Feel quite smug about it

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
So…
Got my environments in order
DEV

QA

PROD

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
So…

All is good

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
So…

OR IS IT?!?!

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
So…

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
So…

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
So… the problem

How do you get your DEVs
mobile?

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
So… the problem

Have a dev portable platform!
that is the *SAME* everywhere

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
So… the problem

Why the hell they all work from
Starbucks?!?!?

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Vagrant!

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Vagrant!
You have a base Box VM
Add some script sprinkles
Attach to chef or Puppet!
or something else

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Base Box
You have a base Box

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Base Box
Where can I run this Base Box?
VirtualBox!
VMWare Fusion!
VMWare Workstation

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Base Box
Where can I run this Base Box?
Rackspace Cloud!
Amazon!
OpenStack

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Base Box
As simple as 1…2…3…
vagrant	
  box	
  add	
  $title	
  $BOX_URL	
  
vagrant	
  init	
  $title	
  
vagrant	
  up

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Plugins!
ansible	
  
vagrant-­‐berkshelf	
  
vagrant-­‐librarian-­‐puppet	
  
vagrant-­‐lxc	
  
vagrant-­‐salt
RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Vagrantfile

Defines what Vagrant will do

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Vagrantfile
Vagrant.configure("2")	
  do	
  |config|	
  
	
  	
  	
  	
  config.vm.box	
  =	
  "precise64"	
  
	
  	
  	
  	
  config.vm.box_url	
  =	
  "http://files.vagrantup.com/precise64.box"	
  
	
  	
  	
  	
  config.vm.network	
  :private_network,	
  ip:	
  "192.168.33.10"	
  
	
  	
  	
  	
  config.vm.synced_folder	
  "../data",	
  "/vagrant_data"	
  
	
  	
  	
  	
  config.vm.provider	
  :virtualbox	
  do	
  |vb|	
  
	
  	
  	
  	
  	
  	
  	
  	
  vb.customize	
  ["modifyvm",	
  :id,	
  "-­‐-­‐memory",	
  "1024"]	
  
	
  	
  	
  	
  end	
  
end	
  

!
RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Vagrantfile
Vagrant.configure("2")	
  do	
  |config|	
  
	
  	
  	
  	
  config.vm.box	
  =	
  "precise64"	
  
	
  	
  	
  	
  config.vm.box_url	
  =	
  "http://files.vagrantup.com/precise64.box"	
  
	
  	
  	
  	
  config.vm.network	
  :private_network,	
  ip:	
  "192.168.33.10"	
  
	
  	
  	
  	
  config.vm.provision	
  :puppet	
  do	
  |puppet|	
  
	
  	
  	
  	
  	
  	
  	
  	
  puppet.manifests_path	
  =	
  "manifests"	
  
	
  	
  	
  	
  	
  	
  	
  	
  puppet.manifest_file	
  	
  =	
  "init.pp"	
  
	
  	
  	
  	
  end	
  	
  
end	
  

!
RACKSPACE® HOSTING

!

|

WWW.RACKSPACE.CO.UK
Taking this to 11!

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Taking this to 11!
Vagrant.configure("2")	
  do	
  |config|	
  
	
  	
  config.vm.provision	
  "shell",	
  inline:	
  "echo	
  Hello"	
  
	
  	
  config.vm.define	
  "web"	
  do	
  |web|	
  
	
  	
  	
  	
  web.vm.box	
  =	
  "apache"	
  
	
  	
  end	
  
	
  	
  config.vm.define	
  "db"	
  do	
  |db|	
  
	
  	
  	
  	
  db.vm.box	
  =	
  "mysql"	
  
	
  	
  end	
  
end	
  

!
RACKSPACE® HOSTING

!

|

WWW.RACKSPACE.CO.UK
Taking this to 11!

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
And now…

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
And now…

Packer!

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer

Do your GMs RIGHT

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer
Add that Puppet!
you always!
wanted

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer

From a single config file

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer

Deploy EVERYWHERE

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer
Amazon AWS!
Digital Ocean!
OpenStack!
VMWare
RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer
{	
  
	
  	
  "builders":	
  [{	
  
	
  	
  	
  	
  "type":	
  "amazon-­‐ebs",	
  
	
  	
  	
  	
  "access_key":	
  "YOUR	
  KEY	
  HERE",	
  
	
  	
  	
  	
  "secret_key":	
  "YOUR	
  SECRET	
  KEY	
  HERE",	
  
	
  	
  	
  	
  "region":	
  "us-­‐east-­‐1",	
  
	
  	
  	
  	
  "source_ami":	
  "ami-­‐de0d9eb7",	
  
	
  	
  	
  	
  "instance_type":	
  "t1.micro",	
  
	
  	
  	
  	
  "ssh_username":	
  "ubuntu",	
  
	
  	
  	
  	
  "ami_name":	
  "packer-­‐example	
  {{timestamp}}"	
  
	
  	
  }]	
  
}	
  
RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer
$	
  packer	
  build	
  example.json	
  
==>	
  amazon-­‐ebs:	
  amazon-­‐ebs	
  output	
  will	
  be	
  in	
  this	
  color.	
  
==>	
  amazon-­‐ebs:	
  Creating	
  temporary	
  keypair	
  for	
  this	
  instance...	
  
==>	
  amazon-­‐ebs:	
  Creating	
  temporary	
  security	
  group	
  for	
  this	
  instance...	
  
==>	
  amazon-­‐ebs:	
  Authorizing	
  SSH	
  access	
  on	
  the	
  temporary	
  security	
  group...	
  
==>	
  amazon-­‐ebs:	
  Launching	
  a	
  source	
  AWS	
  instance...	
  
==>	
  amazon-­‐ebs:	
  Waiting	
  for	
  instance	
  to	
  become	
  ready...	
  
==>	
  amazon-­‐ebs:	
  Connecting	
  to	
  the	
  instance	
  via	
  SSH...	
  
==>	
  amazon-­‐ebs:	
  Stopping	
  the	
  source	
  instance...	
  
==>	
  amazon-­‐ebs:	
  Waiting	
  for	
  the	
  instance	
  to	
  stop...	
  
==>	
  amazon-­‐ebs:	
  Creating	
  the	
  AMI:	
  packer-­‐example	
  1371856345	
  
==>	
  amazon-­‐ebs:	
  AMI:	
  ami-­‐19601070	
  
==>	
  amazon-­‐ebs:	
  Waiting	
  for	
  AMI	
  to	
  become	
  ready...	
  
==>	
  amazon-­‐ebs:	
  Terminating	
  the	
  source	
  AWS	
  instance...	
  
==>	
  amazon-­‐ebs:	
  Deleting	
  temporary	
  security	
  group...	
  
==>	
  amazon-­‐ebs:	
  Deleting	
  temporary	
  keypair...	
  
==>	
  amazon-­‐ebs:	
  Build	
  finished.	
  

!

==>	
  Builds	
  finished.	
  The	
  artifacts	
  of	
  successful	
  builds	
  are:	
  
-­‐-­‐>	
  amazon-­‐ebs:	
  AMIs	
  were	
  created:	
  

!

us-­‐east-­‐1:	
  ami-­‐19601070	
  
RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer
Deploy to more than one!
provider at the same time!
using the “builders” array

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer
$	
  packer	
  build	
  example.json	
  
==>	
  amazon-­‐ebs:	
  amazon-­‐ebs	
  output	
  will	
  be	
  in	
  this	
  color.	
  
==>	
  digitalocean:	
  digitalocean	
  output	
  will	
  be	
  in	
  this	
  color.	
  

!

==>	
  digitalocean:	
  Creating	
  temporary	
  ssh	
  key	
  for	
  droplet...	
  
==>	
  amazon-­‐ebs:	
  Creating	
  temporary	
  keypair	
  for	
  this	
  instance...	
  
==>	
  amazon-­‐ebs:	
  Creating	
  temporary	
  security	
  group	
  for	
  this	
  instance...	
  
==>	
  digitalocean:	
  Creating	
  droplet...	
  
==>	
  amazon-­‐ebs:	
  Authorizing	
  SSH	
  access	
  on	
  the	
  temporary	
  security	
  group...	
  
==>	
  amazon-­‐ebs:	
  Launching	
  a	
  source	
  AWS	
  instance...	
  
==>	
  digitalocean:	
  Waiting	
  for	
  droplet	
  to	
  become	
  active...	
  
==>	
  amazon-­‐ebs:	
  Waiting	
  for	
  instance	
  to	
  become	
  ready...	
  
==>	
  digitalocean:	
  Connecting	
  to	
  the	
  droplet	
  via	
  SSH...	
  
==>	
  amazon-­‐ebs:	
  Connecting	
  to	
  the	
  instance	
  via	
  SSH...	
  
...	
  
==>	
  Builds	
  finished.	
  The	
  artifacts	
  of	
  successful	
  builds	
  are:	
  
-­‐-­‐>	
  amazon-­‐ebs:	
  AMIs	
  were	
  created:	
  

!

us-­‐east-­‐1:	
  ami-­‐376d1d5e	
  
-­‐-­‐>	
  digitalocean:	
  A	
  snapshot	
  was	
  created:	
  packer-­‐1371870364	
  

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer
Also deploy to Vagrant!
using the “post-processors”!
array

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
Packer
{	
  
	
  	
  "builders":	
  [...],	
  

!
	
  	
  "provisioners":	
  [...],	
  

!
	
  	
  "post-­‐processors":	
  ["vagrant"]	
  
}

RACKSPACE® HOSTING

|

WWW.RACKSPACE.CO.UK
RACKSPACE® HOSTING
|
UK SALES: +44 (0)20 8712 6507

RACKSPACE® HOSTING

|

© RACKSPACE US, INC.

|

5 MILLINGTON ROAD
|
HAYES, UNITED KINGDOM UB3 4AZ
|
UK SUPPORT: 0800 988 0300
|
WWW.RACKSPACE.CO.UK

RACKSPACE® AND FANATICAL SUPPORT® ARE SERVICE MARKS OF RACKSPACE US, INC. REGISTERED IN THE UNITED STATES AND OTHER COUNTRIES.

|

WWW.RACKSPACE.CO.UK

!39

Rackspace Hack Night - Vagrant & Packer

  • 1.
  • 2.
    So… I automated *all*the things RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 3.
    So… Feel quite smugabout it RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 4.
    So… Got my environmentsin order DEV QA PROD RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 5.
    So… All is good RACKSPACE®HOSTING | WWW.RACKSPACE.CO.UK
  • 6.
    So… OR IS IT?!?! RACKSPACE®HOSTING | WWW.RACKSPACE.CO.UK
  • 7.
  • 8.
  • 9.
    So… the problem Howdo you get your DEVs mobile? RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 10.
    So… the problem Havea dev portable platform! that is the *SAME* everywhere RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 11.
    So… the problem Whythe hell they all work from Starbucks?!?!? RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 12.
  • 13.
    Vagrant! You have abase Box VM Add some script sprinkles Attach to chef or Puppet! or something else RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 14.
    Base Box You havea base Box RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 15.
    Base Box Where canI run this Base Box? VirtualBox! VMWare Fusion! VMWare Workstation RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 16.
    Base Box Where canI run this Base Box? Rackspace Cloud! Amazon! OpenStack RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 17.
    Base Box As simpleas 1…2…3… vagrant  box  add  $title  $BOX_URL   vagrant  init  $title   vagrant  up RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 18.
    Plugins! ansible   vagrant-­‐berkshelf   vagrant-­‐librarian-­‐puppet   vagrant-­‐lxc   vagrant-­‐salt RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 19.
    Vagrantfile Defines what Vagrantwill do RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 20.
    Vagrantfile Vagrant.configure("2")  do  |config|          config.vm.box  =  "precise64"          config.vm.box_url  =  "http://files.vagrantup.com/precise64.box"          config.vm.network  :private_network,  ip:  "192.168.33.10"          config.vm.synced_folder  "../data",  "/vagrant_data"          config.vm.provider  :virtualbox  do  |vb|                  vb.customize  ["modifyvm",  :id,  "-­‐-­‐memory",  "1024"]          end   end   ! RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 21.
    Vagrantfile Vagrant.configure("2")  do  |config|          config.vm.box  =  "precise64"          config.vm.box_url  =  "http://files.vagrantup.com/precise64.box"          config.vm.network  :private_network,  ip:  "192.168.33.10"          config.vm.provision  :puppet  do  |puppet|                  puppet.manifests_path  =  "manifests"                  puppet.manifest_file    =  "init.pp"          end     end   ! RACKSPACE® HOSTING ! | WWW.RACKSPACE.CO.UK
  • 22.
    Taking this to11! RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 23.
    Taking this to11! Vagrant.configure("2")  do  |config|      config.vm.provision  "shell",  inline:  "echo  Hello"      config.vm.define  "web"  do  |web|          web.vm.box  =  "apache"      end      config.vm.define  "db"  do  |db|          db.vm.box  =  "mysql"      end   end   ! RACKSPACE® HOSTING ! | WWW.RACKSPACE.CO.UK
  • 24.
    Taking this to11! RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 25.
  • 26.
  • 27.
    Packer Do your GMsRIGHT RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 28.
    Packer Add that Puppet! youalways! wanted RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 29.
  • 30.
    Packer From a singleconfig file RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 31.
  • 32.
  • 33.
    Packer {      "builders":  [{          "type":  "amazon-­‐ebs",          "access_key":  "YOUR  KEY  HERE",          "secret_key":  "YOUR  SECRET  KEY  HERE",          "region":  "us-­‐east-­‐1",          "source_ami":  "ami-­‐de0d9eb7",          "instance_type":  "t1.micro",          "ssh_username":  "ubuntu",          "ami_name":  "packer-­‐example  {{timestamp}}"      }]   }   RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 34.
    Packer $  packer  build  example.json   ==>  amazon-­‐ebs:  amazon-­‐ebs  output  will  be  in  this  color.   ==>  amazon-­‐ebs:  Creating  temporary  keypair  for  this  instance...   ==>  amazon-­‐ebs:  Creating  temporary  security  group  for  this  instance...   ==>  amazon-­‐ebs:  Authorizing  SSH  access  on  the  temporary  security  group...   ==>  amazon-­‐ebs:  Launching  a  source  AWS  instance...   ==>  amazon-­‐ebs:  Waiting  for  instance  to  become  ready...   ==>  amazon-­‐ebs:  Connecting  to  the  instance  via  SSH...   ==>  amazon-­‐ebs:  Stopping  the  source  instance...   ==>  amazon-­‐ebs:  Waiting  for  the  instance  to  stop...   ==>  amazon-­‐ebs:  Creating  the  AMI:  packer-­‐example  1371856345   ==>  amazon-­‐ebs:  AMI:  ami-­‐19601070   ==>  amazon-­‐ebs:  Waiting  for  AMI  to  become  ready...   ==>  amazon-­‐ebs:  Terminating  the  source  AWS  instance...   ==>  amazon-­‐ebs:  Deleting  temporary  security  group...   ==>  amazon-­‐ebs:  Deleting  temporary  keypair...   ==>  amazon-­‐ebs:  Build  finished.   ! ==>  Builds  finished.  The  artifacts  of  successful  builds  are:   -­‐-­‐>  amazon-­‐ebs:  AMIs  were  created:   ! us-­‐east-­‐1:  ami-­‐19601070   RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 35.
    Packer Deploy to morethan one! provider at the same time! using the “builders” array RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 36.
    Packer $  packer  build  example.json   ==>  amazon-­‐ebs:  amazon-­‐ebs  output  will  be  in  this  color.   ==>  digitalocean:  digitalocean  output  will  be  in  this  color.   ! ==>  digitalocean:  Creating  temporary  ssh  key  for  droplet...   ==>  amazon-­‐ebs:  Creating  temporary  keypair  for  this  instance...   ==>  amazon-­‐ebs:  Creating  temporary  security  group  for  this  instance...   ==>  digitalocean:  Creating  droplet...   ==>  amazon-­‐ebs:  Authorizing  SSH  access  on  the  temporary  security  group...   ==>  amazon-­‐ebs:  Launching  a  source  AWS  instance...   ==>  digitalocean:  Waiting  for  droplet  to  become  active...   ==>  amazon-­‐ebs:  Waiting  for  instance  to  become  ready...   ==>  digitalocean:  Connecting  to  the  droplet  via  SSH...   ==>  amazon-­‐ebs:  Connecting  to  the  instance  via  SSH...   ...   ==>  Builds  finished.  The  artifacts  of  successful  builds  are:   -­‐-­‐>  amazon-­‐ebs:  AMIs  were  created:   ! us-­‐east-­‐1:  ami-­‐376d1d5e   -­‐-­‐>  digitalocean:  A  snapshot  was  created:  packer-­‐1371870364   RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 37.
    Packer Also deploy toVagrant! using the “post-processors”! array RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 38.
    Packer {      "builders":  [...],   !    "provisioners":  [...],   !    "post-­‐processors":  ["vagrant"]   } RACKSPACE® HOSTING | WWW.RACKSPACE.CO.UK
  • 39.
    RACKSPACE® HOSTING | UK SALES:+44 (0)20 8712 6507 RACKSPACE® HOSTING | © RACKSPACE US, INC. | 5 MILLINGTON ROAD | HAYES, UNITED KINGDOM UB3 4AZ | UK SUPPORT: 0800 988 0300 | WWW.RACKSPACE.CO.UK RACKSPACE® AND FANATICAL SUPPORT® ARE SERVICE MARKS OF RACKSPACE US, INC. REGISTERED IN THE UNITED STATES AND OTHER COUNTRIES. | WWW.RACKSPACE.CO.UK !39