Gérer ses environnements de développement avec vagrant - PHP Tour Nantes 2012

  • 2,247 views
Uploaded on

Gérer un environnement de développement efficace est une tâche plus complexe qu'il n'y paraît à première vue. D'une part parce qu'en réalité nous devons souvent en avoir plusieurs, des projets …

Gérer un environnement de développement efficace est une tâche plus complexe qu'il n'y paraît à première vue. D'une part parce qu'en réalité nous devons souvent en avoir plusieurs, des projets différents nécessitant généralement des configurations différentes, d'autre part parce que nous travaillons rarement seul sur un projet. Il faut donc trouver un moyen de garder une relative synchronisation entre les environnements des différents développeurs tout en évitant de polluer leurs machines avec des composants trop spécifiques ou incompatibles entre eux. Nous verrons comment Vagrant simplifie cette gestion des environnements de développement. Il s'agit d'un outil basé sur VirtualBox qui permet d'utiliser Puppet ou Chef pour gérer les configurations de machines virtuelles.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,247
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
22
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Gérer ses environnements dedéveloppement avec Vagrant PHP Tour Nantes 2012 1
  • 2. Jean-Marc FontainePassionné de web depuis 1996, de PHP depuis 2000 et demusique depuis 1977 ‣ Responsable de la qualité logicielle chez Profilsoft 2
  • 3. Quest-ce quun environnement de développement ? 3
  • 4. Développement Recette Production 4
  • 5. Développement Recette Production 5
  • 6. Plusieurs approches 6
  • 7. Copie sur l’environnement de production ‣ Rapide à mettre en œuvre ‣ Risque important d’impact sur la production ‣ Très mauvaise idée ! 7
  • 8. 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
  • 9. 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
  • 10. Les problèmes 10
  • 11. Comment maintenir (facilement)la parité entre dévelopemment etproduction ? 11
  • 12. Comment lutter contre le syndrome«Pourtant ça marche chez moi» ? 12
  • 13. Comment faire cohabiter sur une mêmemachine des projets très différents ? 13
  • 14. Comment permettre à un nouveaudéveloppeur d’être rapidementopérationnel sur le projet ? 14
  • 15. Comment faire évoluer la configurationdu sytème une fois le développementcommencé ? 15
  • 16. Comment tester sans risque desmontées de versions, de nouveaux outilsou une nouvelle configuration ? 16
  • 17. La virtualisation à la rescousse 17
  • 18. DéfinitionPossibilité d’installer un ou plusieurs systèmesd’exploitation invités sur un système d’exploitationhôte. 18
  • 19. Là encore, plusieurs approches 19
  • 20. Là encore, plusieurs approches ‣ Virtualisation complète ‣ Paravirtualisation ‣ Virtualisation matériellement assistée ‣ Virtualisation logiciellement assistée 20
  • 21. 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 21
  • 22. 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 22
  • 23. Peut mieux faireLa 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é ? 23
  • 24. Vagrant 24
  • 25. Vagrantvagrantup.com ‣ Outil en ligne de commande ‣ Utilise VirtualBox (Pour le moment) ‣ Ecrit en Ruby 25
  • 26. Installation ‣ Paquets disponibles pour la plupart des systèmes d’exploitation : downloads.vagrantup.com ‣ Via Ruby Gem : gem install vagrant 26
  • 27. Créer sa première instance$ vagrant box add precise32 http://files.vagrantup.com/precise32.box$ vagrant init precise32$ vagrant up 27
  • 28. Se connecter à l’instance$ vagrant ssh 28
  • 29. 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 29
  • 30. Fichier VagrantfileExample 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 30
  • 31. Fichier VagrantfileBox de baseVagrant::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 31
  • 32. Fichier VagrantfileRéseau «hostonly» IP de l’instanceVagrant::Config.run do |config| … config.vm.network :hostonly, "192.168.33.10" config.vm.forward_port 80, 8080 …end Port hôte Port invité 32
  • 33. Fichier VagrantfileRéseau «bridged»Vagrant::Config.run do |config| … config.vm.network :briged …end 33
  • 34. Fichier VagrantfileRépertoires partagés Identifiant Chemin invité Chemin hôteVagrant::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 34
  • 35. Performances des partages NFSExé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é 13sRépertoires partagés VirtualBox 5m 14s Répertoire partagé NFS 22s Répertoire partagé NFS 14s (Cache chaud) 35
  • 36. Fichier VagrantfileParamétrage fin de la VM Identifiant de la VM injecté par VagrantVagrant::Config.run do |config| … config.vm.customize [ "modifyvm", :id, "--memory", 1024 ] config.vm.customize [ "modifyvm", :id, "--cpus", 2 ] config.vm.customize [ "modifyvm", :id, "--chipset", "ich9" ] …end 36
  • 37. Fichier VagrantfileGestion de plusieurs VM Première VMVagrant::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 37
  • 38. Provisionnement 38
  • 39. Outils de provisionnementGestion de la configuration des VM‣Créé en 2009 ‣Créé en 2005‣Syntaxe Ruby ‣Syntaxe spécifique‣Versions indépendante et serveur ‣Versions indépendante et serveur 39
  • 40. Provisionnement avec PuppetQuelques précisions sur le langage proposé ‣ Langage spécifique (DSL) ‣ Langage déclaratif ‣ Concepts de base • Utilisateurs / Groupes / Droits • Commandes • Paquets • Services 40
  • 41. Fichier VagrantfileProvisionnement avec PuppetVagrant::Config.run do |config| … config.vm.provision :puppet do |puppet| puppet.manifests_path = "puppet/manifests" puppet.manifest_file = "application.pp" puppet.module_path = "puppet/modules" end …end 41
  • 42. Provisionnement avec PuppetExemple d’arborescence Application de démonstration Configuration de Puppet Fichier de configuration de Vagrant 42
  • 43. manifests/application.ppFichier de déclaration de base # Set default path for Exec callsExec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ]}node default { include params include system Inclusion de manifests include apache} 43
  • 44. manifests/params.ppFichier de configuration class params { # Apache server name # Make sure this server name points to the IP defined in theVagranfile $servername = "www.application.local" # Apache port $port = "80" # Message of the day to be displayed at login $motd = "Welcome to your application development virtualmachine!"} 44
  • 45. 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 <| |> … 45
  • 46. 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, }} 46
  • 47. 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"] } … 47
  • 48. 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, }} 48
  • 49. modules/apache/templates/vhost.erbGabarit 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/"> Injection de paramètres ## Apache Options -Indexes AllowOverride None Order allow,deny Allow from all </Directory></VirtualHost> 49
  • 50. ExemplesUsage de Vagrant avec Puppet ‣ L’ensemble des fichiers d’exemple sont disponibles sur Github : https://github.com/jmfontaine/vagrant-talk 50
  • 51. Créer ses propres boxesCe n’est pas parce que je suis paranoïaque qu’ils ne sont pasaprè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) 51
  • 52. Plugin vbguest‣ Mise à jour automatique des Addons Invités de VirtualBox 52
  • 53. Plugin hosts ‣ Définition automatique des noms de domaine dans /etc/hostsconfig.vm.host_name = www.exemple.com 53
  • 54. Merci ! ‣ Slides : www.slideshare.net/JMF ‣ Twitter : @jmfontaine ‣ Email : jm@jmfontaine.net ‣ Blog : jmfontaine.net 54
  • 55. Crédits photographiquesLes photos et illustrations suivantes ont été utilisées dans cettepré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/ 55