Gérer ses environnements de développement avec Vagrant RMLL 2012 1
Jean-Marc Fontaine Passionné de web depuis 1996, de PHP depuis 2000 et de musique depuis 1977 Consultant PHP chez Alter Way Ex-Président de l AFUP Co-Auteur du livre blanc «Industrialisation PHP» Auteur du blog industrialisation-php.com 2
Qu'est-ce qu'un environnement de développement? 3
Développement Recette Production 4
Développement Recette Production 5
Plusieurs approches 6
Copie sur l environnement de production Rapide à mettre en œuvre Risque important d impact sur la production Très mauvaise idée! 7
Environnement dédié Serveur spécifique Espace pour chacun des développeurs Configuration centralisée Effets de bords possibles entre développeurs Obligation d être connecté au serveur 8
Machine locale Indépendance totale des autres développeurs Possibilité de travailler sans connexion réseau Difficulté à gérer des projets avec des besoins incompatibles Limité à un seul système d exploitation 9
Les problèmes 10
Comment maintenir (facilement) la parité entre dévelopemment et production? 11
Comment lutter contre le syndrome «Pourtant ça marche chez moi»? 12
Comment faire cohabiter sur une même machine des projets très différents? 13
Comment permettre à un nouveau développeur d être rapidement opérationnel sur le projet? 14
Comment faire évoluer la configuration du sytème une fois le le développement commencé? 15
Comment tester sans risque des montées de versions, de nouveaux outils ou une nouvelle configuration? 16
La virtualisation à la rescousse 17
Définition Possibilité d installer un ou plusieurs systèmes d exploitation invités sur un système d exploitation hôte. 18
Là encore, plusieurs approches 19
Virtualisation complète Emulation quasi-complète du matériel Pas de modification du système d exploitation invité Outils VirtualBox VMWare 20
Paravirtualisation Pas d émulation du matériel Nécessite des modifications du système d exploitation invité Outils Xen 21
Virtualisation matériellement assistée Usage des fonctionnalités spécialisées des CPU CPU de type Intel VT-x et AMD-V Pas de modification du système d exploitation invité Outils KVM VirtualBox VMWare Xen 22
Virtualisation logiciellement assistée Usage des fonctionnalités spécialisées de l OS hôte Implémentation au niveau du système d exploitation hôte Le système d exploitation invité partage le kernel de l hôte Pas de modification du système d exploitation invité Outils OpenVZ LXC 23
Avantages de la virtualisation Possibilité de lancer (presque) n importe quel système d exploitation sur (presque) n importe quelle machine Possibilité d installer les mêmes versions qu en production Fonctionnement en «bac à sable» Possibilité de distribuer les images des VM Possibilité de travailler hors-ligne 24
Inconvénients de la virtualisation La plupart des solutions Open Source nécessitent d avoir un hôte Unix Certaines solutions nécessitent des connaissances avancées 25
Peut mieux faire La virtualisation n est pas toute la solution Lutter contre le syndrome «Pourtant ça marche chez moi»? Faire cohabiter sur une même machine des projets très différents? Permettre à un nouveau développeur d être rapidement opérationnel sur le projet? Tester sans risque des montées de versions, de nouveaux outils ou une nouvelle configuration? Maintenir (facilement) la parité entre dévelopemment et production? Permettre de faire évoluer la configuration du système une fois le le développement commencé? 26
Vagrant 27
Vagrant vagrantup.com Outil en ligne de commande Utilise VirtualBox Ecrit en Ruby 28
Installation Paquets disponibles pour la plupart des systèmes d exploitation : downloads.vagrantup.com Via Ruby Gem : gem install vagrant 29
Créer sa première instance $ vagrant box add precise32 http://files.vagrantup.com/precise32.box $ vagrant init precise32 $ vagrant up 30
Se connecter à l instance $ vagrant ssh 31
Aperçu des commandes # Suspendre l instance $ vagrant suspend # Reprendre l instance $ vagrant resume # Stopper l instance $ vagrant halt # Recharger l instance $ vagrant reload # Détruire l instance $ vagrant destroy # Connaître l état de l instance $ vagrant status 32
Fichier Vagrantfile Example simplifié Vagrant::Config.run do config config.vm.box = "precise32" config.vm.box_url = "http://files.vagrantup.com/precise32.box" # config.vm.boot_mode = :gui config.vm.network :bridged # config.vm.forward_port 80, 8080 # config.vm.share_folder "v-data", "/vagrant_data", "../data" end 33
Fichier Vagrantfile Box de base Vagrant::Config.run do config config.vm.box = "precise32" Nom de la box de base config.vm.box_url = "http://files.vagrantup.com/precise32.box" end URL de la box de base 34
Fichier Vagrantfile Réseau «hostonly» IP de l instance Vagrant::Config.run do config config.vm.network :hostonly, "192.168.33.10" config.vm.forward_port 80, 8080 end Port hôte Port invité 35
Fichier Vagrantfile Réseau «bridged» Vagrant::Config.run do config config.vm.network :briged end 36
Fichier Vagrantfile Répertoires partagés Identifiant Chemin invité Chemin hôte Vagrant::Config.run do config config.vm.share_folder "v-app", "/vagrant_app", "./application" config.vm.share_folder "v-other-app", "/vagrant_other_app", "./ other_application", :nfs => true end Partage NFS 37
Performances des partages NFS Exécution de 6 000 tests d une application Ruby on Rails Durée Système de fichiers hôte 10s Système de fichiers invité 13s Répertoires partagés VirtualBox 5m 14s Répertoire partagé NFS 22s Répertoire partagé NFS (Cache chaud) 14s 38
Fichier Vagrantfile Paramétrage fin de la VM Identifiant de la VM injecté par Vagrant Vagrant::Config.run do config db_config.vm.customize [ "modifyvm", :id, "--memory", 1024 ] db_config.vm.customize [ "modifyvm", :id, "--cpus", 2 ] db_config.vm.customize [ "modifyvm", :id, "--chipset", "ich9" ] end 39
Fichier Vagrantfile Gestion de plusieurs VM Première VM Vagrant::Config.run do config config.vm.define :web do web_config web_config.vm.box = "precise32" web_config.vm.network :hostonly, "192.168.33.10" web_config.vm.share_folder "v-app", "/vagrant_app", "./ application" Seconde VM end config.vm.define :db do db_config db_config.vm.box = "lucid32" db_config.vm.network :hostonly, "192.168.33.11" db_config.vm.customize [ "modifyvm", :id, "--memory", 1024 ] end end 40
Provisionnement 41
Outils de provisionnement Gestion de la configuration des VM Créé en 2009 Syntaxe Ruby Versions indépendante et serveur Créé en 2005 Syntaxe spécifique Versions indépendante et serveur 42
Provisionnement avec Puppet Quelques précisions sur le langage proposé Langage spécifique (DSL) Langage déclaratif Concepts de base Utilisateurs / Groupes / Droits Commandes Paquets Services 43
Fichier Vagrantfile Provisionnement avec Puppet Vagrant::Config.run do config config.vm.provision :puppet do puppet puppet.manifests_path = "puppet/manifests" puppet.manifest_file = "application.pp" end end puppet.module_path = "puppet/modules" 44
Provisionnement avec Puppet Exemple d arborescence Application de démonstration Configuration de Puppet Fichier de configuration de Vagrant 45
manifests/application.pp Fichier de déclaration de base # Set default path for Exec calls Exec { path => [ "/bin/", "/sbin/", "/usr/bin/", "/usr/sbin/" ] } node default { include params include system include apache } Inclusion de manifests 46
manifests/params.pp Fichier de configuration class params { # Apache server name # Make sure this server name points to the IP defined in the Vagranfile $servername = "www.application.local" # Apache port $port = "80" # Message of the day to be displayed at login $motd = "Welcome to your application development virtual machine!" } 47
modules/system/manifests/init.pp (1/2) Fichier de déclaration du module «system» class system { # Create "puppet" group group { "puppet": ensure => "present", } # Define default files permissions File { owner => 0, group => 0, mode => 0644 } # Update packages list before doing anything exec { "apt.update" : command => "apt-get update", } Exec["apt.update"]->Package < > 48
modules/system/manifests/init.pp (2/2) Fichier de déclaration du module «system» # Define message of the day file { "motd" : path => "/etc/motd.tail", ensure => present, content => $motd } } # Install some useful packages package { [ "htop" ] : ensure => present, } 49
modules/apache/manifests/init.pp (1/2) Fichier de déclaration du module «apache» class apache { package { "apache" : ensure => "present", name => "apache2", } file { "apache.vhost" : path => "/etc/apache2/sites-available/default", ensure => present, content => template("apache/vhost.erb"), owner => "root", group => "root", notify => Exec["apache.reload"], require => Package["apache"] } 50
modules/apache/manifests/init.pp (2/2) Fichier de déclaration du module «apache» Exec["apache.reload"], require => Package["apache"] } service { "apache" : ensure => "running", name => "apache2", enable => true, require => Package["apache"], } } exec { "apache.reload" : command => "service apache2 reload", refreshonly => true, } 51
modules/apache/templates/vhost.erb Gabarit pour le VirtualHost Apache NameVirtualHost *:<%= scope.lookupvar('params::port') %> <VirtualHost *:<%= scope.lookupvar('params::port') %>> ServerName <%= scope.lookupvar('params::servername') %> ## Apache AddDefaultCharset UTF-8 DocumentRoot "/vagrant_app/" <Directory "/vagrant_app/"> ## Apache Options -Indexes AllowOverride None Order allow,deny Allow from all </Directory> </VirtualHost> Injection de paramètres 52
Démo 53
Démonstration Usage de Vagrant avec Puppet L ensemble des fichiers de la démonstration sont disponibles sur Github : https://github.com/jmfontaine/vagrant-talk 54
Créer ses propres boxes Ce n est pas parce que je suis paranoïaque qu ils ne sont pas après moi Veewee (https://github.com/jedi4ever/veewee/) Recettes de création d une box Possibilité de modifier la recette Nombreuses recettes disponibles Linux (Debian, Fedora, CentOS, ArchLinux, OpenSUSE) BSD (FreeBSD) Windows (Windows 2008, Windows 7, Windows 8) 55
Merci! Slides : http://www.slideshare.net/jmf Blog : http://www.industrialisation-php.com/ Twitter : @jmfontaine / @indusphp Email : jean-marc.fontaine@alterway.fr 56
Crédits photographiques Les photos et illustrations suivantes ont été utilisées dans cette présentation. Merci à leurs auteurs! https://secure.flickr.com/photos/wiccked/69537422/ https://secure.flickr.com/photos/r000pert/136999467 https://secure.flickr.com/photos/knolleary/6212065238 https://secure.flickr.com/photos/kevinomara/4665065738/ Logo de Vagrant tiré du site officiel : http://vagrantup.com/ Photo de Jérôme Bonaldi d origine inconnue 57