gérer ses environnements de développement avec vagrant - rmll 2012
Post on 25-May-2015
4.277 Views
Preview:
DESCRIPTION
TRANSCRIPT
1
Gérer ses environnements de développement avec Vagrant
RMLL 2012
Passionné de web depuis 1996, de PHP depuis 2000 et de musique depuis 1977
Jean-Marc Fontaine
‣ 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 ?
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 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
Emulation quasi-complète du matériel
20
Virtualisation complète
‣ Pas de modification du système d’exploitation invité‣ Outils• VirtualBox
• VMWare
Pas d’émulation du matériel
21
Paravirtualisation
‣ Nécessite des modifications du système d’exploitation invité
‣ Outils• Xen
Usage des fonctionnalités spécialisées des CPU
22
Virtualisation matériellement assistée
‣ CPU de type Intel VT-x et AMD-V ‣ Pas de modification du système d’exploitation invité‣ Outils• KVM
• VirtualBox
• VMWare
• Xen
Usage des fonctionnalités spécialisées de l’OS hôte
23
Virtualisation logiciellement assistée
‣ 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
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
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
La virtualisation n’est pas toute la solutionPeut mieux faire
26
✓✓✓✓
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é ?✗
27
Vagrant
vagrantup.com
28
Vagrant
‣ Outil en ligne de commande‣ Utilise VirtualBox‣ Ecrit en Ruby
29
Installation
‣ Paquets disponibles pour la plupart des systèmes d’exploitation : downloads.vagrantup.com
‣ Via Ruby Gem : gem install vagrant
30
Créer sa première instance
$ vagrant box add precise32 http://files.vagrantup.com/precise32.box$ vagrant init precise32$ vagrant up
31
Se connecter à l’instance
$ vagrant ssh
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
Example simplifié
33
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
34
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»
35
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»
36
Fichier Vagrantfile
Vagrant::Config.run do |config| … config.vm.network :briged …end
Répertoires partagés
37
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
38
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
39
Fichier Vagrantfile
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
Identifiant de la VM injecté par Vagrant
Gestion de plusieurs VM
40
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
41
Provisionnement
Gestion de la configuration des VMOutils de provisionnement
42
‣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é
43
Provisionnement avec Puppet
‣ Langage spécifique (DSL)‣ Langage déclaratif‣ Concepts de base• Utilisateurs / Groupes / Droits
• Commandes
• Paquets
• Services
Provisionnement avec Puppet
44
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
45
Provisionnement avec Puppet
Fichier de configuration de Vagrant
Configuration de Puppet
Application de démonstration
Fichier de déclaration de base
46
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
47
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»
48
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»
49
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»
50
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»
51
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
52
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
53
Démo
Usage de Vagrant avec Puppet
54
Démonstration
‣ L’ensemble des fichiers de la démonstration 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
55
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)
56
Merci !
‣ Slides : http://www.slideshare.net/JMF‣ Blog : http://www.industrialisation-php.com/‣ Twitter : @jmfontaine / @indusphp‣ Email : jean-marc.fontaine@alterway.fr
Les photos et illustrations suivantes ont été utilisées dans cette présentation. Merci à leurs auteurs !
57
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/
‣ Photo de Jérôme Bonaldi d’origine inconnue
top related