Slide 1

Slide 1 text

VAGRANT POUR LES DÉVELOPPEURS Alexis Seigneurin - @aseigneurin

Slide 2

Slide 2 text

Sommaire • Vagrant ? • Création d’une VM simple • Provisionning • Reconstitution d’une infra « réaliste » • Repackaging de boxes

Slide 3

Slide 3 text

Vagrant

Slide 4

Slide 4 text

Vagrant • https://www.vagrantup.com/ • Orchestration de machines virtuelles • VMs redistribuables : Vagrantfile + base box • Plutôt orienté développeur • Surtout utilisé pour VMs Linux

Slide 5

Slide 5 text

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…

Slide 6

Slide 6 text

Création d’une VM simple

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Commandes de base • $ vagrant up • $ vagrant status • $ vagrant suspend / resume • $ vagrant halt • $ vagrant destroy

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Récap • VM headless • Up & running en 30 secondes

Slide 14

Slide 14 text

Provisioning Ansible, mais pas que…

Slide 15

Slide 15 text

Provisioning • Support : Shell, Ansible, Puppet, Chef, Salt… • Provisioning executé : • Au lancement de la VM ($ vagrant up) • Manuellement ($ vagrant provision)

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Reconstitution d’une infra « réaliste »

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Configuration réseau 192.168.1.10 : 80 192.168.1.11 : 80 192.168.1.12 : 80

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Récap • 3 VMs "isolées ensemble" • Up & running en 2 minutes 30

Slide 25

Slide 25 text

Mais… • 3 VMs = 3 provisioning • 3 x apt-get update • 2 x installation Apache

Slide 26

Slide 26 text

Repackaging de boxes

Slide 27

Slide 27 text

VM -> BOX • Boxes : • Nom et/ou URL • Source : en local, http://, file:// • $ vagrant box list

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Récap • Up & running en 1 minutes 30

Slide 31

Slide 31 text

Mais… • Pas automatisé • Pas de contrôle sur la box d'origine • -> Packer

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Tips

Slide 34

Slide 34 text

Source Control • Commiter : • Vagrantfile • Scripts Shell, Ansible… • Ne pas commiter (et ignorer) : • .vagrant/

Slide 35

Slide 35 text

Ubuntu Desktop • Transformer une Ubuntu Server en Ubuntu Desktop • vb.gui = true • $ apt-get install ubuntu-desktop • Rebooter après l’installation

Slide 36

Slide 36 text

Questions ? Alexis Seigneurin - @aseigneurin