SlideShare une entreprise Scribd logo
1  sur  57
Télécharger pour lire hors ligne
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
                                              14s
       (Cache chaud)                                       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                       ‣Créé en 2005
‣Syntaxe Ruby                       ‣Syntaxe spécifique
‣Versions indépendante et serveur   ‣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"
    puppet.module_path    = "puppet/modules"
  end
  …
end




                                                 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            Inclusion de manifests
    include apache
}




                                                                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/">
                                              Injection de paramètres
        ## Apache
        Options -Indexes
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>


                                                                        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

Contenu connexe

Tendances

Déploiements avec Docker
Déploiements avec DockerDéploiements avec Docker
Déploiements avec DockerLuis Lopez
 
CasperJs, votre nouveau meilleur ami
CasperJs, votre nouveau meilleur amiCasperJs, votre nouveau meilleur ami
CasperJs, votre nouveau meilleur amiMickaël Andrieu
 
Julien Maitrehenry - Docker, ça mange quoi au printemps
Julien Maitrehenry - Docker, ça mange quoi au printempsJulien Maitrehenry - Docker, ça mange quoi au printemps
Julien Maitrehenry - Docker, ça mange quoi au printempsWeb à Québec
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Fabien Arcellier
 
Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Jérôme Petazzoni
 
Docker Tours Meetup #1 - Introduction à Docker
Docker Tours Meetup #1 - Introduction à DockerDocker Tours Meetup #1 - Introduction à Docker
Docker Tours Meetup #1 - Introduction à DockerThibaut Marmin
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinLudovic Piot
 
Installation et configuration d'openbravo
Installation et configuration d'openbravoInstallation et configuration d'openbravo
Installation et configuration d'openbravoSoumia Brabije
 
Introduction à Docker et Gaudi
Introduction à Docker et GaudiIntroduction à Docker et Gaudi
Introduction à Docker et GaudiEmmanuel Quentin
 
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?Membré Guillaume
 
Docker ! De la découverte à la mise en production / Digital apéro [19/03/2015]
Docker ! De la découverte à la mise en production / Digital apéro [19/03/2015]Docker ! De la découverte à la mise en production / Digital apéro [19/03/2015]
Docker ! De la découverte à la mise en production / Digital apéro [19/03/2015]Silicon Comté
 
NightClazz Docker Découverte
NightClazz Docker Découverte NightClazz Docker Découverte
NightClazz Docker Découverte Zenika
 
Docker nice meetup #1 construire, déployer et exécuter vos applications, ...
Docker nice meetup #1   construire, déployer et exécuter vos applications, ...Docker nice meetup #1   construire, déployer et exécuter vos applications, ...
Docker nice meetup #1 construire, déployer et exécuter vos applications, ...adri1s
 
20081008 - Tours Jug - Apache Maven
20081008  - Tours Jug - Apache Maven20081008  - Tours Jug - Apache Maven
20081008 - Tours Jug - Apache MavenArnaud Héritier
 
Introduction à Docker et utilisation en production /Digital apéro Besançon [1...
Introduction à Docker et utilisation en production /Digital apéro Besançon [1...Introduction à Docker et utilisation en production /Digital apéro Besançon [1...
Introduction à Docker et utilisation en production /Digital apéro Besançon [1...Silicon Comté
 
DevOps avec Ansible et Docker
DevOps avec Ansible et DockerDevOps avec Ansible et Docker
DevOps avec Ansible et DockerStephane Manciot
 
A la découverte de docker
A la découverte de dockerA la découverte de docker
A la découverte de dockerjean pasqualini
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSmartnSkilled
 

Tendances (20)

Déploiements avec Docker
Déploiements avec DockerDéploiements avec Docker
Déploiements avec Docker
 
CasperJs, votre nouveau meilleur ami
CasperJs, votre nouveau meilleur amiCasperJs, votre nouveau meilleur ami
CasperJs, votre nouveau meilleur ami
 
Julien Maitrehenry - Docker, ça mange quoi au printemps
Julien Maitrehenry - Docker, ça mange quoi au printempsJulien Maitrehenry - Docker, ça mange quoi au printemps
Julien Maitrehenry - Docker, ça mange quoi au printemps
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
 
Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Docker en Production (Docker Paris)
Docker en Production (Docker Paris)
 
Docker Tours Meetup #1 - Introduction à Docker
Docker Tours Meetup #1 - Introduction à DockerDocker Tours Meetup #1 - Introduction à Docker
Docker Tours Meetup #1 - Introduction à Docker
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 
Installation et configuration d'openbravo
Installation et configuration d'openbravoInstallation et configuration d'openbravo
Installation et configuration d'openbravo
 
Introduction à Docker et Gaudi
Introduction à Docker et GaudiIntroduction à Docker et Gaudi
Introduction à Docker et Gaudi
 
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
 
Docker ! De la découverte à la mise en production / Digital apéro [19/03/2015]
Docker ! De la découverte à la mise en production / Digital apéro [19/03/2015]Docker ! De la découverte à la mise en production / Digital apéro [19/03/2015]
Docker ! De la découverte à la mise en production / Digital apéro [19/03/2015]
 
NightClazz Docker Découverte
NightClazz Docker Découverte NightClazz Docker Découverte
NightClazz Docker Découverte
 
Docker nice meetup #1 construire, déployer et exécuter vos applications, ...
Docker nice meetup #1   construire, déployer et exécuter vos applications, ...Docker nice meetup #1   construire, déployer et exécuter vos applications, ...
Docker nice meetup #1 construire, déployer et exécuter vos applications, ...
 
Meetup Systemd vs sysvinit
Meetup Systemd vs sysvinitMeetup Systemd vs sysvinit
Meetup Systemd vs sysvinit
 
20081008 - Tours Jug - Apache Maven
20081008  - Tours Jug - Apache Maven20081008  - Tours Jug - Apache Maven
20081008 - Tours Jug - Apache Maven
 
Docker - YaJUG
Docker  - YaJUGDocker  - YaJUG
Docker - YaJUG
 
Introduction à Docker et utilisation en production /Digital apéro Besançon [1...
Introduction à Docker et utilisation en production /Digital apéro Besançon [1...Introduction à Docker et utilisation en production /Digital apéro Besançon [1...
Introduction à Docker et utilisation en production /Digital apéro Besançon [1...
 
DevOps avec Ansible et Docker
DevOps avec Ansible et DockerDevOps avec Ansible et Docker
DevOps avec Ansible et Docker
 
A la découverte de docker
A la découverte de dockerA la découverte de docker
A la découverte de docker
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
 

Similaire à Gérer ses environnements de développement avec Vagrant - RMLL 2012

Gérer ses environnements de développement avec vagrant - PHP Tour Nantes 2012
Gérer ses environnements de développement avec vagrant - PHP Tour Nantes 2012Gérer ses environnements de développement avec vagrant - PHP Tour Nantes 2012
Gérer ses environnements de développement avec vagrant - PHP Tour Nantes 2012Jean-Marc Fontaine
 
Virtualisation par logiciels libres
Virtualisation par logiciels libresVirtualisation par logiciels libres
Virtualisation par logiciels libresguest3be047
 
cours-supcom-virt.pptx
cours-supcom-virt.pptxcours-supcom-virt.pptx
cours-supcom-virt.pptxManellansari
 
HOWTO Gestion porte-feuilles crypto-monnaies en environnement virtualisé
HOWTO Gestion porte-feuilles crypto-monnaies en environnement virtualiséHOWTO Gestion porte-feuilles crypto-monnaies en environnement virtualisé
HOWTO Gestion porte-feuilles crypto-monnaies en environnement virtualiséAnthony Le Goff
 
alphorm.com - Formation proxmoxVE 3
alphorm.com - Formation proxmoxVE 3alphorm.com - Formation proxmoxVE 3
alphorm.com - Formation proxmoxVE 3Alphorm
 
Docker - un outil pour faciliter le développement et le déploiement informatique
Docker - un outil pour faciliter le développement et le déploiement informatiqueDocker - un outil pour faciliter le développement et le déploiement informatique
Docker - un outil pour faciliter le développement et le déploiement informatiquesdenier
 
Déploiement et débogage à distance
Déploiement et débogage à distanceDéploiement et débogage à distance
Déploiement et débogage à distancepprem
 
Virtualiser une machine_physique
Virtualiser une machine_physiqueVirtualiser une machine_physique
Virtualiser une machine_physiqueanasslv
 
Soirée du Test Logiciel - Mise en place d’une plateforme de test automatisé a...
Soirée du Test Logiciel - Mise en place d’une plateforme de test automatisé a...Soirée du Test Logiciel - Mise en place d’une plateforme de test automatisé a...
Soirée du Test Logiciel - Mise en place d’une plateforme de test automatisé a...TelecomValley
 
Techdays 2009 - La virtualisation de machines avec Hyper-V
Techdays 2009 - La virtualisation de machines avec Hyper-VTechdays 2009 - La virtualisation de machines avec Hyper-V
Techdays 2009 - La virtualisation de machines avec Hyper-Vfabricemeillon
 
Gestion des dépendances dans un projet PHP - RMLL 2012
Gestion des dépendances dans un projet PHP - RMLL 2012Gestion des dépendances dans un projet PHP - RMLL 2012
Gestion des dépendances dans un projet PHP - RMLL 2012Jean-Marc Fontaine
 
Deploiement de Plone et Deliverance avec Ubuntu VM Builder
Deploiement de Plone et Deliverance avec Ubuntu VM BuilderDeploiement de Plone et Deliverance avec Ubuntu VM Builder
Deploiement de Plone et Deliverance avec Ubuntu VM BuilderParis, France
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsHugo Hamon
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesChristophe Furmaniak
 
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...AbdellahELMAMOUN
 
Du Docker dans notre workflow de dev
Du Docker dans notre workflow de devDu Docker dans notre workflow de dev
Du Docker dans notre workflow de devKodo Kojo
 
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-grâce-à-Docker.pdf
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-grâce-à-Docker.pdfJFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-grâce-à-Docker.pdf
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-grâce-à-Docker.pdfqsdqsd4
 

Similaire à Gérer ses environnements de développement avec Vagrant - RMLL 2012 (20)

Gérer ses environnements de développement avec vagrant - PHP Tour Nantes 2012
Gérer ses environnements de développement avec vagrant - PHP Tour Nantes 2012Gérer ses environnements de développement avec vagrant - PHP Tour Nantes 2012
Gérer ses environnements de développement avec vagrant - PHP Tour Nantes 2012
 
Virtualisation par logiciels libres
Virtualisation par logiciels libresVirtualisation par logiciels libres
Virtualisation par logiciels libres
 
cours-supcom-virt.pptx
cours-supcom-virt.pptxcours-supcom-virt.pptx
cours-supcom-virt.pptx
 
What is Docker
What is Docker What is Docker
What is Docker
 
HOWTO Gestion porte-feuilles crypto-monnaies en environnement virtualisé
HOWTO Gestion porte-feuilles crypto-monnaies en environnement virtualiséHOWTO Gestion porte-feuilles crypto-monnaies en environnement virtualisé
HOWTO Gestion porte-feuilles crypto-monnaies en environnement virtualisé
 
alphorm.com - Formation proxmoxVE 3
alphorm.com - Formation proxmoxVE 3alphorm.com - Formation proxmoxVE 3
alphorm.com - Formation proxmoxVE 3
 
A Libre Ouvert : Virtual box
A Libre Ouvert : Virtual boxA Libre Ouvert : Virtual box
A Libre Ouvert : Virtual box
 
Vm ware
Vm wareVm ware
Vm ware
 
Docker - un outil pour faciliter le développement et le déploiement informatique
Docker - un outil pour faciliter le développement et le déploiement informatiqueDocker - un outil pour faciliter le développement et le déploiement informatique
Docker - un outil pour faciliter le développement et le déploiement informatique
 
Déploiement et débogage à distance
Déploiement et débogage à distanceDéploiement et débogage à distance
Déploiement et débogage à distance
 
Virtualiser une machine_physique
Virtualiser une machine_physiqueVirtualiser une machine_physique
Virtualiser une machine_physique
 
Soirée du Test Logiciel - Mise en place d’une plateforme de test automatisé a...
Soirée du Test Logiciel - Mise en place d’une plateforme de test automatisé a...Soirée du Test Logiciel - Mise en place d’une plateforme de test automatisé a...
Soirée du Test Logiciel - Mise en place d’une plateforme de test automatisé a...
 
Techdays 2009 - La virtualisation de machines avec Hyper-V
Techdays 2009 - La virtualisation de machines avec Hyper-VTechdays 2009 - La virtualisation de machines avec Hyper-V
Techdays 2009 - La virtualisation de machines avec Hyper-V
 
Gestion des dépendances dans un projet PHP - RMLL 2012
Gestion des dépendances dans un projet PHP - RMLL 2012Gestion des dépendances dans un projet PHP - RMLL 2012
Gestion des dépendances dans un projet PHP - RMLL 2012
 
Deploiement de Plone et Deliverance avec Ubuntu VM Builder
Deploiement de Plone et Deliverance avec Ubuntu VM BuilderDeploiement de Plone et Deliverance avec Ubuntu VM Builder
Deploiement de Plone et Deliverance avec Ubuntu VM Builder
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantes
 
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
 
Du Docker dans notre workflow de dev
Du Docker dans notre workflow de devDu Docker dans notre workflow de dev
Du Docker dans notre workflow de dev
 
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-grâce-à-Docker.pdf
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-grâce-à-Docker.pdfJFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-grâce-à-Docker.pdf
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-grâce-à-Docker.pdf
 

Plus de Jean-Marc Fontaine

Revue de code - PHP Tour Nantes 2012
Revue de code - PHP Tour Nantes 2012Revue de code - PHP Tour Nantes 2012
Revue de code - PHP Tour Nantes 2012Jean-Marc Fontaine
 
La qualité au delà du code - Forum PHP 2012
La qualité au delà du code - Forum PHP 2012La qualité au delà du code - Forum PHP 2012
La qualité au delà du code - Forum PHP 2012Jean-Marc Fontaine
 
Reprise sur incident - ConFoo 2012
Reprise sur incident - ConFoo 2012Reprise sur incident - ConFoo 2012
Reprise sur incident - ConFoo 2012Jean-Marc Fontaine
 
La qualité au-delà du code - ConFoo 2012
La qualité au-delà du code - ConFoo 2012La qualité au-delà du code - ConFoo 2012
La qualité au-delà du code - ConFoo 2012Jean-Marc Fontaine
 
Industrialiser PHP - Open World Forum 2011
Industrialiser PHP - Open World Forum 2011Industrialiser PHP - Open World Forum 2011
Industrialiser PHP - Open World Forum 2011Jean-Marc Fontaine
 
Reprise sur incident - RMLL 2011
Reprise sur incident - RMLL 2011Reprise sur incident - RMLL 2011
Reprise sur incident - RMLL 2011Jean-Marc Fontaine
 
Organiser efficacement son dépôt de code - RMLL 2011
Organiser efficacement son dépôt de code - RMLL 2011Organiser efficacement son dépôt de code - RMLL 2011
Organiser efficacement son dépôt de code - RMLL 2011Jean-Marc Fontaine
 
Maintenir du code historique - RMLL 2011
Maintenir du code historique - RMLL 2011Maintenir du code historique - RMLL 2011
Maintenir du code historique - RMLL 2011Jean-Marc Fontaine
 
Comment monter son business grâce à l'Open Source ?
Comment monter son business grâce à l'Open Source ?Comment monter son business grâce à l'Open Source ?
Comment monter son business grâce à l'Open Source ?Jean-Marc Fontaine
 
Industrialiser ses développements PHP - RMLL 2010
Industrialiser ses développements PHP - RMLL 2010Industrialiser ses développements PHP - RMLL 2010
Industrialiser ses développements PHP - RMLL 2010Jean-Marc Fontaine
 
Revues de code - Forum PHP 2010
Revues de code - Forum PHP 2010Revues de code - Forum PHP 2010
Revues de code - Forum PHP 2010Jean-Marc Fontaine
 
Industrialisation de PHP - Be Zend 2010
Industrialisation de PHP - Be Zend 2010Industrialisation de PHP - Be Zend 2010
Industrialisation de PHP - Be Zend 2010Jean-Marc Fontaine
 
Solutions Linux 2010 - Maîtrise du développement PHP
Solutions Linux 2010 - Maîtrise du développement PHPSolutions Linux 2010 - Maîtrise du développement PHP
Solutions Linux 2010 - Maîtrise du développement PHPJean-Marc Fontaine
 
PHP 5.3 : Une étape importante sur la route vers PHP 6
PHP 5.3 : Une étape importante sur la route vers PHP 6PHP 5.3 : Une étape importante sur la route vers PHP 6
PHP 5.3 : Une étape importante sur la route vers PHP 6Jean-Marc Fontaine
 
Déboguer une application web avec FirePHP
Déboguer une application web avec FirePHPDéboguer une application web avec FirePHP
Déboguer une application web avec FirePHPJean-Marc Fontaine
 
Utilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHPUtilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHPJean-Marc Fontaine
 

Plus de Jean-Marc Fontaine (17)

Revue de code - PHP Tour Nantes 2012
Revue de code - PHP Tour Nantes 2012Revue de code - PHP Tour Nantes 2012
Revue de code - PHP Tour Nantes 2012
 
La qualité au delà du code - Forum PHP 2012
La qualité au delà du code - Forum PHP 2012La qualité au delà du code - Forum PHP 2012
La qualité au delà du code - Forum PHP 2012
 
Reprise sur incident - ConFoo 2012
Reprise sur incident - ConFoo 2012Reprise sur incident - ConFoo 2012
Reprise sur incident - ConFoo 2012
 
La qualité au-delà du code - ConFoo 2012
La qualité au-delà du code - ConFoo 2012La qualité au-delà du code - ConFoo 2012
La qualité au-delà du code - ConFoo 2012
 
Industrialiser PHP - Open World Forum 2011
Industrialiser PHP - Open World Forum 2011Industrialiser PHP - Open World Forum 2011
Industrialiser PHP - Open World Forum 2011
 
Reprise sur incident - RMLL 2011
Reprise sur incident - RMLL 2011Reprise sur incident - RMLL 2011
Reprise sur incident - RMLL 2011
 
Organiser efficacement son dépôt de code - RMLL 2011
Organiser efficacement son dépôt de code - RMLL 2011Organiser efficacement son dépôt de code - RMLL 2011
Organiser efficacement son dépôt de code - RMLL 2011
 
Maintenir du code historique - RMLL 2011
Maintenir du code historique - RMLL 2011Maintenir du code historique - RMLL 2011
Maintenir du code historique - RMLL 2011
 
Comment monter son business grâce à l'Open Source ?
Comment monter son business grâce à l'Open Source ?Comment monter son business grâce à l'Open Source ?
Comment monter son business grâce à l'Open Source ?
 
Industrialiser ses développements PHP - RMLL 2010
Industrialiser ses développements PHP - RMLL 2010Industrialiser ses développements PHP - RMLL 2010
Industrialiser ses développements PHP - RMLL 2010
 
Revues de code - Forum PHP 2010
Revues de code - Forum PHP 2010Revues de code - Forum PHP 2010
Revues de code - Forum PHP 2010
 
Industrialisation de PHP - Be Zend 2010
Industrialisation de PHP - Be Zend 2010Industrialisation de PHP - Be Zend 2010
Industrialisation de PHP - Be Zend 2010
 
Solutions Linux 2010 - Maîtrise du développement PHP
Solutions Linux 2010 - Maîtrise du développement PHPSolutions Linux 2010 - Maîtrise du développement PHP
Solutions Linux 2010 - Maîtrise du développement PHP
 
PHP : Etat des lieux
PHP : Etat des lieuxPHP : Etat des lieux
PHP : Etat des lieux
 
PHP 5.3 : Une étape importante sur la route vers PHP 6
PHP 5.3 : Une étape importante sur la route vers PHP 6PHP 5.3 : Une étape importante sur la route vers PHP 6
PHP 5.3 : Une étape importante sur la route vers PHP 6
 
Déboguer une application web avec FirePHP
Déboguer une application web avec FirePHPDéboguer une application web avec FirePHP
Déboguer une application web avec FirePHP
 
Utilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHPUtilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHP
 

Gérer ses environnements de développement avec Vagrant - RMLL 2012

  • 1. Gérer ses environnements de développement avec Vagrant RMLL 2012 1
  • 2. 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
  • 3. Qu'est-ce qu'un environnement de développement ? 3
  • 4. Développement Recette Production 4
  • 5. Développement Recette Production 5
  • 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
  • 11. Comment maintenir (facilement) la parité entre dévelopemment et production ? 11
  • 12. Comment lutter contre le syndrome «Pourtant ça marche chez moi» ? 12
  • 13. Comment faire cohabiter sur une même machine des projets très différents ? 13
  • 14. Comment permettre à un nouveau développeur d’être rapidement opérationnel sur le projet ? 14
  • 15. Comment faire évoluer la configuration du sytème une fois le le développement commencé ? 15
  • 16. Comment tester sans risque des montées de versions, de nouveaux outils ou une nouvelle configuration ? 16
  • 17. La virtualisation à la rescousse 17
  • 18. Définition Possibilité d’installer un ou plusieurs systèmes d’exploitation invités sur un système d’exploitation hôte. 18
  • 19. Là encore, plusieurs approches 19
  • 20. Virtualisation complète Emulation quasi-complète du matériel ‣ Pas de modification du système d’exploitation invité ‣ Outils • VirtualBox • VMWare 20
  • 21. Paravirtualisation Pas d’émulation du matériel ‣ Nécessite des modifications du système d’exploitation invité ‣ Outils • Xen 21
  • 22. 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
  • 23. 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
  • 24. 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
  • 25. 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
  • 26. 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
  • 27. Vagrant 27
  • 28. Vagrant vagrantup.com ‣ Outil en ligne de commande ‣ Utilise VirtualBox ‣ Ecrit en Ruby 28
  • 29. Installation ‣ Paquets disponibles pour la plupart des systèmes d’exploitation : downloads.vagrantup.com ‣ Via Ruby Gem : gem install vagrant 29
  • 30. Créer sa première instance $ vagrant box add precise32 http://files.vagrantup.com/precise32.box $ vagrant init precise32 $ vagrant up 30
  • 31. Se connecter à l’instance $ vagrant ssh 31
  • 32. 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
  • 33. 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
  • 34. 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
  • 35. 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
  • 36. Fichier Vagrantfile Réseau «bridged» Vagrant::Config.run do |config| … config.vm.network :briged … end 36
  • 37. 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
  • 38. 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 14s (Cache chaud) 38
  • 39. 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
  • 40. 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
  • 42. Outils de provisionnement Gestion 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 42
  • 43. 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
  • 44. 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" puppet.module_path = "puppet/modules" end … end 44
  • 45. Provisionnement avec Puppet Exemple d’arborescence Application de démonstration Configuration de Puppet Fichier de configuration de Vagrant 45
  • 46. 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 Inclusion de manifests include apache } 46
  • 47. 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
  • 48. 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
  • 49. 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
  • 50. 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
  • 51. 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
  • 52. 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/"> Injection de paramètres ## Apache Options -Indexes AllowOverride None Order allow,deny Allow from all </Directory> </VirtualHost> 52
  • 53. Démo 53
  • 54. 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
  • 55. 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
  • 56. Merci ! ‣ Slides : http://www.slideshare.net/JMF ‣ Blog : http://www.industrialisation-php.com/ ‣ Twitter : @jmfontaine / @indusphp ‣ Email : jean-marc.fontaine@alterway.fr 56
  • 57. 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