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