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

Post on 15-May-2015

2.585 views 1 download

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

1

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

3

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

4

Développement Recette Production

5

Développement Recette Production

6

Plusieurs approches

7

Copie sur l’environnement de production

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

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

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

10

Les problèmes

11

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

12

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

13

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

14

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

15

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

16

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

17

La virtualisation à la rescousse

18

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

19

Là encore, plusieurs approches

20

Là encore, plusieurs approches

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

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

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

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

24

Vagrant

vagrantup.com

25

Vagrant

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

26

Installation

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

‣ Via Ruby Gem : gem install vagrant

27

Créer sa première instance

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

28

Se connecter à l’instance

$ vagrant ssh

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

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

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

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é

Réseau «bridged»

33

Fichier Vagrantfile

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

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

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

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

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

38

Provisionnement

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

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

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

Exemple d’arborescence

42

Provisionnement avec Puppet

Fichier de configuration de Vagrant

Configuration de Puppet

Application de démonstration

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

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

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

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

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

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

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

Usage de Vagrant avec Puppet

50

Exemples

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

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)

Plugin vbguest

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

52

Plugin hosts

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

53

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

54

Merci !

‣ Slides : www.slideshare.net/JMF‣ Twitter : @jmfontaine‣ Email : jm@jmfontaine.net‣ Blog : jmfontaine.net

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/