Vagrant pour les développeurs

Alexis Seigneurin - @aseigneurin

Ippon Technologies - @ippontech

 

(Flèches droite/gauche et haut/bas pour naviguer, ESC pour tout afficher)

Demandez le programme

  • Vagrant ?
  • Création d'une VM simple
  • Reconstitution d'une infra
  • Repackaging de boxes

Vagrant ?

Vagrant

Orchestration de machines virtuelles

VMs redistribuables : Vagrantfile + base box

Plutôt orienté développeur

Features

  • Virtualisation : VirtualBox, VMware, Hyper-V
  • Configuration réseau + répertoire partagés
  • Provisioning : Shell, Puppet, Chef...

Création d'une VM simple

Choix d'une base box

Vagrantfile


Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "saucy-server-amd64"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/saucy/current/saucy-server-cloudimg-amd64-vagrant-disk1.box"

  config.vm.provision "shell", path: "scripts/provision.sh"

end
						

Commandes de base

  • $ vagrant up
  • $ vagrant ssh
  • $ vagrant status
  • $ vagrant provision
  • $ vagrant suspend / halt
  • $ vagrant destroy

Recap

VM headless

Up & running en 30 secondes

Provisioning

Reproduction d'une infra "réaliste"

3 VMs :

  • 2 back-ends Apache : fichier statique
  • 1 front-end Nginx : load-balancer

 

Layer 1 Apache #1 Apache #2 Apache #1 Nginx

Configuration réseau

Layer 1 Apache #1 : 8011 192.168.1.12 : 80 192.168.1.11 : 80 192.168.1.10 : 80 : 8010 : 8012

Vagrantfile


Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "saucy-server-amd64"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/saucy/current/saucy-server-cloudimg-amd64-vagrant-disk1.box"

  config.vm.provision "shell", path: "scripts/provision-shared.sh"

  config.vm.define "back-end-1" do |backend1|
    backend1.vm.network "private_network", ip: "192.168.1.11", virtualbox__intnet: "network1"
    backend1.vm.network "forwarded_port", guest: 80, host: 8011
    backend1.vm.provision "shell", path: "scripts/provision-backend-1.sh"
  end

  config.vm.define "back-end-2" do |backend2|
    backend2.vm.network "private_network", ip: "192.168.1.12", virtualbox__intnet: "network1"
    backend2.vm.network "forwarded_port", guest: 80, host: 8012
    backend2.vm.provision "shell", path: "scripts/provision-backend-2.sh"
  end

  config.vm.define "front-end" do |frontend|
    frontend.vm.network "private_network", ip: "192.168.1.10", virtualbox__intnet: "network1"
    frontend.vm.network "forwarded_port", guest: 80, host: 8010
    frontend.vm.provision "shell", path: "scripts/provision-frontend.sh"
  end

end					

Commander une VM

  • $ vagrant up back-end-1
  • $ curl localhost:8011
  • $ vagrant status

Commander toutes les VM

  • $ vagrant up
  • $ curl localhost:8011
  • $ curl localhost:8012
  • $ curl localhost:8010
  • $ curl localhost:8010
  • $ vagrant suspend back-end-1
  • $ curl localhost:8010

Recap

3 VMs "isolées ensemble"

Up & running en 2 minutes 30

Mais...

3 VMs = 3 provisioning

3 x apt-get update

2 x installation Apache

Repackaging de boxes

VM -> Box

Boxes :

  • Nom et/ou URL
  • Source : en local, http://, file://

 

$ vagrant box list

Procédure

  • $ VBoxManage list vms
  • $ vagrant package --base <...> --output <...>.box
  • $ vagrant box add <...> <...>.box
  • $ vagrant box list

Vagrantfile


Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.define "back-end-1" do |backend1|
    backend1.vm.box = "back-end-1"
    backend1.vm.network "private_network", ip: "192.168.1.11", virtualbox__intnet: "network2"
    backend1.vm.network "forwarded_port", guest: 80, host: 9011
  end

  config.vm.define "back-end-2" do |backend2|
    backend2.vm.box = "back-end-2"
    backend2.vm.network "private_network", ip: "192.168.1.12", virtualbox__intnet: "network2"
    backend2.vm.network "forwarded_port", guest: 80, host: 9012
  end

  config.vm.define "front-end" do |frontend|
    frontend.vm.box = "front-end"
    frontend.vm.network "private_network", ip: "192.168.1.10", virtualbox__intnet: "network2"
    frontend.vm.network "forwarded_port", guest: 80, host: 9010
  end

end

Recap

Up & running en 1 minutes 30

Mais...

Pas automatisé

Pas de contrôle sur la box d'origine

-> Packer

Recommendations

Utiliser des base boxes de base

  • Si une base box standard convient
  • Si le provisioning est simple

Utiliser des base boxes repackagées

  • Si une base box standard convient
  • Si le provisioning est long

Utiliser des base boxes Packer

  • Si une base box standard ne convient pas
  • Si la target n'est pas (que) Vagrant

Questions ?

@aseigneurin

Code : github.com/aseigneurin/pres-vagrant-breizhcamp

Slides : aseigneurin.github.io/pres-vagrant-breizhcamp