Vagrant pour les développeurs

Vagrant pour les développeurs

Présentation de Vagrant donnée en Brown Bag Lunch (http://www.brownbaglunch.fr/)

Mise à jour en septembre 2015

Code associé : https://github.com/aseigneurin/pres-vagrant/tree/new

B1ed299a884f153fd23b9a1b81b798ac?s=128

Alexis Seigneurin

September 24, 2015
Tweet

Transcript

  1. VAGRANT POUR LES DÉVELOPPEURS Alexis Seigneurin - @aseigneurin

  2. Sommaire • Vagrant ? • Création d’une VM simple •

    Provisionning • Reconstitution d’une infra « réaliste » • Repackaging de boxes
  3. Vagrant

  4. Vagrant • https://www.vagrantup.com/ • Orchestration de machines virtuelles • VMs

    redistribuables : Vagrantfile + base box • Plutôt orienté développeur • Surtout utilisé pour VMs Linux
  5. Features • Providers : • Virtualisation : VirtualBox (défaut), VMware,

    Hyper-V • Cloud : AWS, DigitalOcean… • Docker • Configuration : • CPU, mémoire, réseau • Répertoire partagés • Provisionning : Shell, Ansible, Chef, Puppet…
  6. Création d’une VM simple

  7. Choix d’une base box • https://atlas.hashicorp.com/boxes/search • http://cloud-images.ubuntu.com/ • …

  8. Vagrantfile • $ vagrant init ubuntu/vivid64 Vagrant.configure(2) do |config| config.vm.box

    = "ubuntu/vivid64" end
  9. Commandes de base • $ vagrant up • $ vagrant

    status • $ vagrant suspend / resume • $ vagrant halt • $ vagrant destroy
  10. SSH • Vagrant interagit en SSH avec la VM •

    Port 2222 par défaut • Clé privée générée • Se connecter dans la VM : • $ vagrant ssh
  11. Répertoires partagés • Par défaut, répertoire courant -> /vagrant •

    Possibilité de partager d’autres répertoires : basic (VirtualBox…), NFS… • Attention : les répertoires partagés de VirtualBox sont lents -> préférer NFS Vagrant.configure(2) do |config| # ... config.vm.synced_folder "src/", "/home/vagrant/src" end
  12. Setup de la VM • Nom de la VM (dans

    VirtualBox) • CPU, mémoire • GUI ou Headless (Headless par défaut) Vagrant.configure(2) do |config| config.vm.box = "ubuntu/vivid64" config.vm.provider "virtualbox" do |vb| vb.name = "my_vm" vb.memory = 1024 vb.cpus = 2 vb.gui = true end end
  13. Récap • VM headless • Up & running en 30

    secondes
  14. Provisioning Ansible, mais pas que…

  15. Provisioning • Support : Shell, Ansible, Puppet, Chef, Salt… •

    Provisioning executé : • Au lancement de la VM ($ vagrant up) • Manuellement ($ vagrant provision)
  16. Shell • Commandes shell « inline » ou fichiers Vagrant.configure(2)

    do |config| # ... config.vm.provision "shell", inline: "apt-get update" config.vm.provision "shell", path: "scripts/provision.sh" end
  17. Ansible • Provisioning via un Playbook Ansible • Gestion automatique

    de l’inventaire Vagrant.configure(2) do |config| # ... config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" end end
  18. Reconstitution d’une infra « réaliste »

  19. 3 VMs • 2 back-ends Apache : fichier statique •

    1 front-end Nginx : load-balancer Nginx Apache #1 Apache #2
  20. Configuration réseau 192.168.1.10 : 80 192.168.1.11 : 80 192.168.1.12 :

    80
  21. Vagrantfile Vagrant.configure(2) do |config| config.vm.box = "ubuntu/vivid64" 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
  22. Commander une VM • $ vagrant up back-end-1 • $

    curl localhost:8011 • $ vagrant status
  23. Commander toutes les VMs • $ vagrant up • $

    curl localhost:8011 • $ curl localhost:8012 • $ curl localhost:8010 • $ curl localhost:8010 • $ vagrant suspend back-end-1 • $ curl localhost:8010
  24. Récap • 3 VMs "isolées ensemble" • Up & running

    en 2 minutes 30
  25. Mais… • 3 VMs = 3 provisioning • 3 x

    apt-get update • 2 x installation Apache
  26. Repackaging de boxes

  27. VM -> BOX • Boxes : • Nom et/ou URL

    • Source : en local, http://, file:// • $ vagrant box list
  28. Repackaging • $ VBoxManage list vms • $ vagrant package

    --base <...> --output <...>.box • $ vagrant box add <...> <...>.box • $ vagrant box list
  29. Vagrantfile Vagrant.configure(2) 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
  30. Récap • Up & running en 1 minutes 30

  31. Mais… • Pas automatisé • Pas de contrôle sur la

    box d'origine • -> Packer
  32. 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
  33. Tips

  34. Source Control • Commiter : • Vagrantfile • Scripts Shell,

    Ansible… • Ne pas commiter (et ignorer) : • .vagrant/
  35. Ubuntu Desktop • Transformer une Ubuntu Server en Ubuntu Desktop

    • vb.gui = true • $ apt-get install ubuntu-desktop • Rebooter après l’installation
  36. Questions ? Alexis Seigneurin - @aseigneurin