virtualization,
Vagrant,
Provisioning
@codekipple
Carl Hughes
Straw poll
Who has used vagrant before?
Getting started... install these
- git [1]
- Virtualbox [2]
- Vagrant [3]
-
http://git-scm.com
-
https://www.virtualbox.org
- https://www.vagrantup.com
Notes
Clone the codehub site
git clone https://github.com/CodeHubOrg/CodeHub codehub
It's important that the folder you clone into is called 'codehub' as that is presumed later in our vagrant setup.
Clone the codehub vagrant
git clone https://github.com/CodeHubOrg/codehub-vagrant
git submodule init
git submodule update
It's important that you clone it so the codehub-vagrant and the codehub site both reside in the same directory.
Add vagrant box
vagrant box add codekipple/ubuntu-trusty32-latestpuppet ubuntu-trusty32-puppetlatest.box
vagrant box list
Use vagrant box list to see your newly added vagrant box
Normally this step can be skipped but i created a custom box for use in this workshop. [1]
Once you have downloaded it add it as an available box to vagrant
1. https://www.wetransfer.com/downloads/8d73bf346b6ee7f2c6611dca6831768020150301232619/f3cd7a208c87a3fa8ecff14983367a2920150301232619/0bdff2
Notes
Vagrant up!
Navigate into the codehub vagrant directory and get this thing started.
vagrant up
This may take some time
While that's happening I'll cover what vagrant is, why you might want to use it.
Evolution of my development environment
- FTP Commando - as coined by Chris Coyier [1]
- Installers (XAMMP)
- Virtualisation
- Version controlled virtualisation with Vagrant
1. https://www.flickr.com/photos/59136411@N04/8480701963/
Notes
What is virtualisation?
Run another operating system as a guest on your host machine.
1. https://www.modern.ie/en-us/virtualization-tools
Notes
A popular use of virtualisation is testing older versions of internet explorer. [1]
Pick a provider
- https://www.virtualbox.org
- http://www.vmware.com
- http://www.parallels.com
Notes
FIrst you going to need a tool to virtualise the guest OS. Vagrant calls these providers.
- Virtualbox [1]
- VMware [2]
- Parallels [3]
Pick a server OS
Next your going to need to decide what server OS you want to use.
Once you have downloaded one you can go through the providers GUI following the steps to create a new virtual machine.
Good news / Bad news
Vagrant is easy!
Sysadmin is hard.
Rabbit hole ahead...
Working with the VM
sudo apt-get install ...
- Setup networking
- Install software (apache, mysql ect)
- Setup sharing (NFS if available)
What if you mess the VM up?
... Start again
Vagrant
Automate the creation of Virtual Machines
Vagrant reads a Vagrantfile and builds a machine based on a template called a box.
Basics
- Boxes
- Vagrantfile
- Vagrant command line
Boxes
Normally a bare set of software. An example Linux box may contain the following:
- Pre-installed OS
- SSH user so Vagrant can connect
- A provisioner (Chef, Puppet, etc) but not strictly required.
Each provider may require additional software. E.g. if you're making a box for VirtualBox, you'll want to include the VirtualBox guest additions [1] so that shared folders work properly.
Software is than provisioned on top of it. Although it does not have to work this way, you could pre install as much as you want [2]
- https://www.virtualbox.org/manual/ch04.html
- http://laravel.com/docs/4.2/homestead
Notes
Vagrant Cloud [1]
- https://vagrantcloud.com
Notes
- Find boxes to use
- Store your own boxes for free.
Vagrantfile
Configuration file read by Vagrant
- machine properties
- networks
- what providers / provisioners to use
Ruby based, you can use ruby syntax to assign variables and add some logic if you need it.
Vagrant command line
- http://docs.vagrantup.com/v2/cli/index.html
Notes
The docs are great [1]
Commonly used commands
- vagrant up
- vagrant ssh
- vagrant halt
- vagrant provision
- vagrant reload
- vagrant destroy
What if i break my vagrant managed VM?
vagrant destroy
vagrant up
Take a break while you VM rebuilds.
Vagrant file, closer look
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "codekipple/ubuntu-trusty32-latestpuppet"
if ENV['vm_stages'] == "no"
_stages = "no"
else
_stages = "yes"
end
# Networking
config.vm.network "private_network", type: "dhcp"
# Due to some issues with the ssh keys that arises when a
# VM becomes disassociated with vagrant we are just using
# username and password for now even though it's not as secure
config.ssh.username = "vagrant"
config.ssh.password = "vagrant"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder.
config.vm.synced_folder "../", "/var/www"
# Provider (VirtualBox, VMWare, ect) configuration
# Using VirtualBox:
config.vm.provider :virtualbox do |vb|
# Boot without headless mode
vb.gui = true
# Use VBoxManage to customize the VM. For example to change memory:
vb.customize ["modifyvm", :id, "--memory", "2024"]
vb.customize ["modifyvm", :id, "--cpus", "1"]
# Via http://blog.liip.ch/archive/2012/07/25/vagrant-and-node-js-quick-tip.html
vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
# Provisioning (puppet, chef, ansible, salt, .sh ect) configuration
# Using Puppet
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "manifests"
puppet.manifest_file = "base.pp"
puppet.module_path = "modules"
puppet.hiera_config_path = 'hiera/hiera.yaml' # path on host machine
puppet.working_directory = '/vagrant' # Relative path for hiera data directories
# use facter to pass a hash of variables to puppet set as facter variables
puppet.facter = {
"stages" => _stages
}
# puppet.options = "--verbose --debug"
end
end
Vagrantfile:Networking
- NAT - port forwarding
- Host-only networking - private network
- Bridged networking - public network, VM shows up as device on your network (good for mobile testing)
- Can mix and match
# NAT
config.vm.network "forwarded_port",
guest: 80, host: 8080
# Host only
config.vm.network "private_network",
ip: "192.168.50.4"
# Bridged
config.vm.network "public_network"
Configures host/guest communication
Vagrantfile:Synced folders
- Virtualbox shared folders (guest additions)
- VMware shared folders
- NFS
- rsync
- Many more ...
config.vm.synced_folder "../", "/var/www"
Vagrantfile:Providers
Define your provider, pass in provider specific configuration.
# Provider (VirtualBox, VMWare, ect) configuration
# Using VirtualBox:
config.vm.provider :virtualbox do |vb|
# Boot without headless mode
vb.gui = true
# Use VBoxManage to customize the VM. For example to change memory:
vb.customize ["modifyvm", :id, "--memory", "2024"]
vb.customize ["modifyvm", :id, "--cpus", "1"]
end
Vagrantfile:Provisioners
# Provisioning (puppet, chef, ansible, salt, .sh ect) configuration
# Using Puppet
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "manifests"
puppet.manifest_file = "base.pp"
puppet.module_path = "modules"
puppet.hiera_config_path = 'hiera/hiera.yaml' # path on host machine
puppet.working_directory = '/vagrant' # Relative path for hiera data directories
end
puppet [1], chef [2], ansible [3] [4], salt [5], bash scripts .sh, Many more.
Vagrant can run multiple provisioners, each provisioner doing it's thing and then passing on to the next one [6]
- http://puppetlabs.com
- https://www.chef.io/chef
- http://www.ansible.com
- http://phansible.com
- http://saltstack.com
- http://docs.vagrantup.com/v2/provisioning/basic_usage.html
Notes
Provisioning
- http://kartar.net/2010/01/puppet-chef-deterministic-ordering-and-the-much-maligned-dsl/
- http://phansible.com/
Notes
Recommend trying ansible first. I've heard a lot of good things.
phansible.com [1] looks particularly appealing.
I went with puppet first, but i'm planning on trying ansible next to see if it works out better. Some reasons I found puppet hard.
- Uses dependency graph [1] (a plus or negative depending on your perspective)
- Can't handle recursive files without slowing down massively.
- I found the syntax very confusing
- Variable scope seems weird, might be my inexperience.
Puppet
- hiera
- manifests
- modules
All configuration particular to puppet.
Getting the codehub site working
- ssh into vagrant and load this dummy database. [1]
- Edit your hosts file [2] to match the VM's ip
3. https://www.wetransfer.com/downloads/5bcfcb695e2265e9a738cd7c104d268820150301042603/f9839583a2ee0562ecc317a5336db42720150301042603/718577
2. http://www.rackspace.com/knowledge_center/article/how-do-i-modify-my-hosts-file
Notes
mysql -u root -ppassword codehub_dev < codehub.sql
172.28.128.3 dev.codehub.org.uk
Getting the codehub site working
Flush dns:-
- Mac
- Windows
- Linux
Visit dev.codehub.org.uk in your browser
dscacheutil -flushcache
ipconfig /flushdns
service nscd restart
Vagrant in the wild ...
- Laraval - Homestead [1]
- Ghost [2]
- WordPress - Varying Vagrant Vagrants [3]
- http://laravel.com/docs/4.2/homestead
- https://github.com/TryGhost/Ghost-Vagrant
- https://github.com/Varying-Vagrant-Vagrants/VVV
Notes
Terminology
-
Providers - a piece of software used to create and run virtual machines
-
Box - A base starting point to use whilst building a new virtual machine
-
Provisioner - Software used to programatically setup a web server.
- Provisioning - The act of programatically setting up a web server.
Thanks
Any questions?
Acknowledgements
Mitchell Hashimoto - Not least for creating Vagrant but also for his talk [1] on Vagrant which I used whilst creating these slides.
- https://www.youtube.com/watch?v=Im4wNqlolqQ
Notes
Vagrant and virtualization
By codekipple
Vagrant and virtualization
- 3,785