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

55
1 Gérer ses environnements de développement avec Vagrant PHP Tour Nantes 2012

description

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.

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

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

1

Gérer ses environnements de développement avec Vagrant

PHP Tour Nantes 2012

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

Passionné de web depuis 1996, de PHP depuis 2000 et de musique depuis 1977

Jean-Marc Fontaine

‣ Responsable de la qualité logicielle chez Profilsoft

2

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

3

Qu'est-ce qu'un environnement de développement ?

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

4

Développement Recette Production

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

5

Développement Recette Production

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

6

Plusieurs approches

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

7

Copie sur l’environnement de production

‣ Rapide à mettre en œuvre‣ Risque important d’impact sur la production‣ Très mauvaise idée !

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

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

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

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

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

10

Les problèmes

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

11

Comment maintenir (facilement)la parité entre dévelopemment et production ?

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

12

Comment lutter contre le syndrome «Pourtant ça marche chez moi» ?

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

13

Comment faire cohabiter sur une même machine des projets très différents ?

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

14

Comment permettre à un nouveau développeur d’être rapidement opérationnel sur le projet ?

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

15

Comment faire évoluer la configuration du sytème une fois le développement commencé ?

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

16

Comment tester sans risque des montées de versions, de nouveaux outils ou une nouvelle configuration ?

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

17

La virtualisation à la rescousse

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

18

DéfinitionPossibilité d’installer un ou plusieurs systèmes d’exploitation invités sur un système d’exploitation hôte.

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

19

Là encore, plusieurs approches

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

20

Là encore, plusieurs approches

‣ Virtualisation complète‣ Paravirtualisation‣ Virtualisation matériellement assistée‣ Virtualisation logiciellement assistée

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

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

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

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

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

La virtualisation n’est pas toute la solutionPeut mieux faire

23

✓✓✓✓

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 ?✗

Lutter contre le syndrome «Pourtant ça marche chez moi» ?

Permettre de faire évoluer la configuration du système une fois le le développement commencé ?✗

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

24

Vagrant

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

vagrantup.com

25

Vagrant

‣ Outil en ligne de commande‣ Utilise VirtualBox (Pour le moment)‣ Ecrit en Ruby

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

26

Installation

‣ Paquets disponibles pour la plupart des systèmes d’exploitation : downloads.vagrantup.com

‣ Via Ruby Gem : gem install vagrant

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

27

Créer sa première instance

$ vagrant box add precise32 http://files.vagrantup.com/precise32.box$ vagrant init precise32$ vagrant up

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

28

Se connecter à l’instance

$ vagrant ssh

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

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

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

Example simplifié

30

Fichier Vagrantfile

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

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

Box de base

31

Fichier Vagrantfile

Vagrant::Config.run do |config| … config.vm.box = "precise32" config.vm.box_url = "http://files.vagrantup.com/precise32.box" …end

Nom de la box de base

URL de la box de base

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

Réseau «hostonly»

32

Fichier Vagrantfile

Vagrant::Config.run do |config| … config.vm.network :hostonly, "192.168.33.10"

config.vm.forward_port 80, 8080 …end

IP de l’instance

Port hôte Port invité

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

Réseau «bridged»

33

Fichier Vagrantfile

Vagrant::Config.run do |config| … config.vm.network :briged …end

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

Répertoires partagés

34

Fichier Vagrantfile

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

Identifiant Chemin invité Chemin hôte

Partage NFS

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

Exécution de 6 000 tests d’une application Ruby on RailsPerformances des partages NFS

35

Durée

Système de fichiers hôte

Système de fichiers invité

Répertoires partagés VirtualBox

Répertoire partagé NFS

Répertoire partagé NFS(Cache chaud)

10s

13s

5m 14s

22s

14s

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

Paramétrage fin de la VM

36

Fichier Vagrantfile

Vagrant::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

Identifiant de la VM injecté par Vagrant

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

Gestion de plusieurs VM

37

Fichier Vagrantfile

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" 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

Première VM

Seconde VM

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

38

Provisionnement

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

Gestion de la configuration des VMOutils de provisionnement

39

‣Créé en 2009

‣Syntaxe Ruby

‣Versions indépendante et serveur

‣Créé en 2005

‣Syntaxe spécifique

‣Versions indépendante et serveur

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

Quelques précisions sur le langage proposé

40

Provisionnement avec Puppet

‣ Langage spécifique (DSL)‣ Langage déclaratif‣ Concepts de base• Utilisateurs / Groupes / Droits

• Commandes

• Paquets

• Services

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

Provisionnement avec Puppet

41

Fichier Vagrantfile

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

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

Exemple d’arborescence

42

Provisionnement avec Puppet

Fichier de configuration de Vagrant

Configuration de Puppet

Application de démonstration

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

Fichier de déclaration de base

43

manifests/application.pp

# Set default path for Exec callsExec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ]}

node default { include params include system include apache}

Inclusion de manifests

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

Fichier de configuration

44

manifests/params.pp

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!"}

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

Fichier de déclaration du module «system»

45

modules/system/manifests/init.pp (1/2)

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 <| |> …

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

Fichier de déclaration du module «system»

46

modules/system/manifests/init.pp (2/2)

… # Define message of the day file { "motd" : path => "/etc/motd.tail", ensure => present, content => $motd }

# Install some useful packages package { [ "htop" ] : ensure => present, }}

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

Fichier de déclaration du module «apache»

47

modules/apache/manifests/init.pp (1/2)

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"] } …

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

Fichier de déclaration du module «apache»

48

modules/apache/manifests/init.pp (2/2)

… 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, }}

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

Gabarit pour le VirtualHost Apache

49

modules/apache/templates/vhost.erb

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

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

Usage de Vagrant avec Puppet

50

Exemples

‣ L’ensemble des fichiers d’exemple sont disponibles sur Github :https://github.com/jmfontaine/vagrant-talk

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

Ce n’est pas parce que je suis paranoïaque qu’ils ne sont pas après moi

51

Créer ses propres boxes

‣ 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)

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

Plugin vbguest

‣ Mise à jour automatique des Addons Invités de VirtualBox

52

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

Plugin hosts

‣ Définition automatique des noms de domainedans /etc/hosts

53

config.vm.host_name = 'www.exemple.com'

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

54

Merci !

‣ Slides : www.slideshare.net/JMF‣ Twitter : @jmfontaine‣ Email : [email protected]‣ Blog : jmfontaine.net

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

Les photos et illustrations suivantes ont été utilisées dans cette présentation. Merci à leurs auteurs !

55

Crédits photographiques

‣ 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/