Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Alexis Seigneurin

September 24, 2015
Tweet

More Decks by Alexis Seigneurin

Other Decks in Technology

Transcript

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

    Provisionning • Reconstitution d’une infra « réaliste » • Repackaging de boxes
  2. Vagrant • https://www.vagrantup.com/ • Orchestration de machines virtuelles • VMs

    redistribuables : Vagrantfile + base box • Plutôt orienté développeur • Surtout utilisé pour VMs Linux
  3. 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…
  4. Commandes de base • $ vagrant up • $ vagrant

    status • $ vagrant suspend / resume • $ vagrant halt • $ vagrant destroy
  5. 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
  6. 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
  7. 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
  8. Provisioning • Support : Shell, Ansible, Puppet, Chef, Salt… •

    Provisioning executé : • Au lancement de la VM ($ vagrant up) • Manuellement ($ vagrant provision)
  9. 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
  10. 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
  11. 3 VMs • 2 back-ends Apache : fichier statique •

    1 front-end Nginx : load-balancer Nginx Apache #1 Apache #2
  12. 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
  13. Commander une VM • $ vagrant up back-end-1 • $

    curl localhost:8011 • $ vagrant status
  14. 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
  15. Mais… • 3 VMs = 3 provisioning • 3 x

    apt-get update • 2 x installation Apache
  16. VM -> BOX • Boxes : • Nom et/ou URL

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

    --base <...> --output <...>.box • $ vagrant box add <...> <...>.box • $ vagrant box list
  18. 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
  19. 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
  20. Source Control • Commiter : • Vagrantfile • Scripts Shell,

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

    • vb.gui = true • $ apt-get install ubuntu-desktop • Rebooter après l’installation