View
2.586
Download
1
Category
Preview:
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.
Citation preview
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/
Recommended