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 https://vagrantcloud.com/ http://cloud-images.ubuntu.com/vagrant/...
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-va end config.vm.provision"shell", path:"scripts/provision.sh"
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 Nginx Apache #1 Apache #2
CONFIGURATION RÉSEAU 192.168.1.10 : 80 : 8010 Apache #1 192.168.1.11 : 80 : 8011 192.168.1.12 : 80 : 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-va 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