Upload
antons-kranga
View
114
Download
4
Tags:
Embed Size (px)
DESCRIPTION
Vagrant introduction to development teams.
Citation preview
Vagrant for Developers
Presenter
- Technology Architect at Accenture
- 10+ years Enterprise Java Developmentg
- Areas of work:- Open Source activist- DevOps evangelist- Technical and OO Trainer- Cloud and PaaS development
http://www.linkedin.com/in/antonskranga
Motivation
Basic Vagrant Usage
Provisioning with Cookbooks
Base Images Creation
Agenda
Motivation
Basic Vagrant Usage
Provisioning with Cookbooks
Base Images Creation
Agenda
Every
thing
installe
d
locally
We usingInfrastructure
as Code
Everybody
using
one big VM
How do you manage your Dev Env?
Low or no automation at all
Long error-prone install guides
Painful maintenance or recovery
Painful rollback
No team collaboration
Host everything natviely
Master Image contains:
- All software installed
- All configuration
Hosted typically in project File Server
Often maintained by one Person
No team collaboration
Master Image
Master Image: Problems
Hard to distribute in big teams
Maintenance process is manual
Hard to maintain in parallel
Cannot use Version Control System
Just Enough Operating System
- Written declaratively (just enough ruby DSL)
- Repeatable
- OS agnostic
- Source control
- Help from Community
- Testable
JEOS
+censored
Naked OS Configuration
V for Vagrant
www.vagrantup.com Off Sitewww.vagrantbox.es VM Imageshttps://github.com/opscode/bento VM Images from Chef
Useful Links:
Vagrant
- Vagrant will mange VM for you
- Can create whole stack of VMs
- Describe VM resources in Configuration
- Can put configuration in Source Control
- Easy to distribute and update
Motivation
Basic Vagrant Usage
Provisioning with Cookbooks
Base Images Creation
Agenda
Quick start
shell
$ vagrant up
VagrantfileVagrant.configure "2" do |config|
config.vm.box = "vagrant-1"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end
Quick start v2
shell$ vagrant box add NAME http://files.vagrantup.com/precise64.box $ vagrant init
# modify Vagrantfile until you happy$ vagrant up
Most useful commands
shell
$ vagrant ssh # Connect to VM
$ vagrant reload # Connect to VM
$ vagrant halt # Stop VM
$ vagrant destroy # delete VM
$ vagrant package # Create snapshot (.box file)
Modifying scripts
VagrantfileVagrant.configure "2" do |config|
config.vm.box = "vagrant-1"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end
Modifying scripts
Vagrantfile
Vagrant.configure "2" do |config|
config.vm.box = "vagrant-1"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.hostname = “vmhost"
end
Modifying scripts
VagrantfileVagrant.configure "2" do |config|
config.vm.box = "vagrant-1"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.hostname = “vmhost"
config.vm.network :forwarded_port, guest: 80, host: 1080
end
Modifying scripts
Vagrantfile
Vagrant.configure "2" do |config|
config.vm.box = "vagrant-1"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.hostname = “vmhost"
config.vm.network :forwarded_port, guest: 80, host: 1080 config.vm.synced_folder “webapp/", "/var/www"end
Modifying scripts
VagrantfileVagrant.configure "2" do |config|
config.vm.box = "vagrant-1"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.hostname = “vmhost"
config.vm.network :forwarded_port, guest: 80, host: 1080 config.vm.synced_folder “webapp/", "/var/www“
config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--memory", 1024] endend
Demo
Vagrantfile
Vagrant.configure "2" do |config|
config.vm.define :ubuntu1204 do |ubuntu1204| ubuntu1204.vm.box = "example4-ubuntu-12.10" ubuntu1204.vm.box_url = "http://files.vagrantup..." ubuntu1204.vm.hostname = "example4-ubuntu-1210" ubuntu1204.vm.network :forwarded_port, guest: 80, host: 1080 ubuntu1204.vm.network :private_network, ip: "34.33.33.10" end
config.vm.define :ubuntu1310 do |ubuntu1310| ubuntu1310.vm.box = "example4-ubuntu-13.10" ubuntu1310.vm.box_url = "http://files.vagrantup..." ubuntu1310.vm.hostname = "example4-ubuntu-1310" ubuntu1204.vm.network :forwarded_port, guest: 80, host: 2080 ubuntu1204.vm.network :private_network, ip: "34.33.33.11" end config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--memory", 1024] endend
Motivation
Basic Vagrant Usage
Provisioning with Cookbooks
Base Images Creation
Agenda
- You declare what software you want
- Chef will provision it for you
- Over 1300 cookbooks
Chef
Before you start
shell# install Chef plugin$ vagrant plugin install vagrant-omnibus
# install Berkshelf plugin$ vagrant plugin install vagrant-berkshelf
# Kind of apt-cache for Vagrant$ vagrant plugin install vagrant-cachier
Update configuration
Vagrantfile
Vagrant.configure "2" do |config|
config.vm.box = "vagrant-5" config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.hostname = “localhost" config.vm.network :forwarded_port, guest: 80, host: 1080 config.vm.synced_folder “webapp/", "/var/www“
config.omnibus.chef_version = :latest config.berkshelf.enabled = true config.cache.auto_detect = trueend
Update configuration
Vagrantfile
Vagrant.configure "2" do |config|
config.vm.box = "vagrant-5" config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.hostname = “localhost" config.vm.network :forwarded_port, guest: 80, host: 1080 config.vm.synced_folder “webapp/", "/var/www“
config.omnibus.chef_version = :latest config.berkshelf.enabled = true config.cache.auto_detect = true
config.vm.provision :chef_solo do |chef| chef.add_recipe “apache2“ endend
Create berkshelf configuration
Berksfilesite :opscode
metadata
cookbook "apache2"
Provisioning commands
shell# to provision for first time just enough$ vagrant up
# to restart VM$ vagrant reload --provision
# to provision without restart$ vagrant provision
Demo
Create berkshelf configuration
Berksfile
site :opscode
metadata
cookbook 'apt'cookbook 'git'cookbook 'tomcat', git: "https://github.com/opscode-cookbooks/tomcat.git"cookbook 'maven'cookbook 'mongodb'# cookbook 'mycookbook', :path => "cookbooks/mycookbook"
Vagrantfile
Vagrant.configure "2" do |config|
config.vm.box = "vagrant-5" config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.hostname = “localhost" config.vm.network :forwarded_port, guest: 8080, host: 1080
config.omnibus.chef_version = :latest config.berkshelf.enabled = true config.cache.auto_detect = true
config.vm.provision :chef_solo do |chef| chef.add_recipe "mongodb::10gen_repo" chef.add_recipe "apt" chef.add_recipe "git" chef.add_recipe "maven" chef.add_recipe "mongodb" chef.add_recipe "tomcat" endend
Vagrantfile
Vagrant.configure "2" do |config|
config.vm.box = "vagrant-5" config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.hostname = “localhost" config.vm.network :forwarded_port, guest: 8080, host: 1080
...
config.vm.provision :chef_solo do |chef| chef.add_recipe "mongodb::10gen_repo" chef.add_recipe "apt" chef.add_recipe "git" chef.add_recipe "maven" chef.add_recipe "mongodb" chef.add_recipe "tomcat" chef.json = { "java" => { "jdk_version" => "7", "install_flavor" => "openjdk" } } endend
Vagrantfile
Vagrant.configure "2" do |config|
config.vm.box = "vagrant-5" config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.hostname = “localhost" config.vm.network :forwarded_port, guest: 8080, host: 1080
...
config.vm.provision :chef_solo do |chef| chef.add_recipe "mongodb::10gen_repo" chef.add_recipe "apt" chef.add_recipe "git" chef.add_recipe "maven" chef.add_recipe "mongodb" chef.add_recipe "tomcat" chef.json = { "java" => { "jdk_version" => "7", "install_flavor" => "oracle", "accept_oracle_download_terms" => true } } endend
Motivation
Basic Vagrant Usage
Provisioning with Cookbooks
Base Images Creation
Agenda
Motivation
Custom project specifics
OS-level patching
Produce Stemcells(preinstalled images)
True Infra-as-code
Tools we need“Packer is a tool for creating identical machine images for multiple platforms…”
- Off Site: packer.io- Written in Go- Must be installed to ~/pakcer
“Bento is set of Packer templates for building Vagrant baseboxes”
- Off Site: opscode.github.io/bento/- Maintained by Chef
Shell$ git clone https://github.com/opscode/bento.git$ cd bento/packerbento/packer $ packer build ubuntu-13.10-amd64.json
Quick start with Packer
Shell$ git clone https://github.com/opscode/bento.git$ cd bento/packerbento/packer $ packer build ubuntu-13.10-amd64.json
Quick start with Packer
Shellbento/packer $ packer build \ -only=virtualbox-iso \ ubuntu-13.10-amd64.json
Little bit more tuning
Shellbento/packer $ packer build \ -only=virtualbox \ -var-file=variables.json ubuntu-13.10-amd64.json
Little bit more tuning
variables.json{ "chef_version": "latest", "mirror": "../builds/iso/"}
Demo
Thank You!