Aller au contenu

Development

Créer une boîte Vagrant personnalisée à partir de zéro

Apprenez à créer vos propres boîtes Vagrant personnalisées à partir de zéro pour VirtualBox et VMware Fusion. Ce guide étape par étape couvre tout, de la création de la machine virtuelle à l'empaquetage, pour vous aider à bâtir des environnements de développement légers et réutilisables qui fonctionnent exactement comme vous le souhaitez.

7 min de lecture

Commençons par comprendre ce qu’est un fichier « .box ». Un fichier « .box » de Vagrant n’est rien d’autre qu’une archive tar compressée avec gzip qui contient, au minimum, les métafichiers de la machine virtuelle (VM), la ou les images disque et un fichier metadata.json, qui indique le fournisseur pour lequel la boîte a été créée. D’autres fichiers d’accompagnement facultatifs, comme un Vagrantfile personnalisé, peuvent être inclus dans la boîte au besoin.

Vérification préalable

Une petite vérification s’impose. Les instructions ont été généralisées et devraient fonctionner avec la plupart des hôtes et des invités ayant une configuration semblable. Seules les configurations ci-dessous ont été testées. Aucune garantie, expresse ou implicite, n’est donc offerte.

Notre hôte

Cet article suppose un environnement de développement sous OS X. Sauf indication contraire, tous les logiciels de l’hôte sont réputés être la version pour OS X.

  • Apple OS X Mountain Lion (10.7.5)
  • VirtualBox 4.2.12
  • VMware Fusion 5.0.4
  • Vagrant 1.2.2
  • Fournisseur VMware Fusion de Vagrant 0.6.3, avec une licence valide.

Invités possibles

Tous les invités testés sont des distributions Linux 64 bits.

  • CentOS 6.4
  • Debian 7.0
  • Scientific Linux 6.4
  • Ubuntu 12.10 Desktop
  • Ubuntu 12.10 Server

Créer la machine virtuelle

Lancez d’abord le logiciel de virtualisation et créez la VM sur laquelle notre boîte Vagrant sera basée. Les options de configuration suivantes sont recommandées lors de la définition de la VM :

VirtualBox

Créez une nouvelle VM dans VirtualBox :

  • Nom : vagrant-<distro><arch>, p. ex. vagrant-centos64
  • Type : Linux
  • Version : <distro> (64-bit)
  • Taille de la mémoire : 1024 Mo*
  • Nouveau disque virtuel :
    • Type : VMDK (Dynamically allocated)
    • Taille maximale : 40 Go

Modifiez les paramètres de la VM :

  • Désactivez l’audio
  • Désactivez l’USB
  • Assurez-vous que la carte réseau 1 est réglée sur NAT
  • Ajoutez une règle de redirection de port comme suit :
    • Nom : SSH
    • Protocole : TCP
    • IP de l’hôte :
    • Port de l’hôte : 2222
    • IP de l’invité :
    • Port de l’invité : 22
  • Montez l’image ISO de la distribution Linux

VMware Fusion

Créez une nouvelle machine virtuelle à l’aide de l’assistant :

  • Sélectionnez « Continue without disc »
  • Sélectionnez « Choose a disc or disc image… »
  • Repérez l’image ISO de la distribution que vous souhaitez installer, puis sélectionnez « Open »
  • Décochez la case « Use Easy Install »
  • Choisissez « Customize Settings »
  • Entrez un nom pour le fichier VMware et sélectionnez « Save »

Personnalisez les paramètres de la VM :

  • Activez les dossiers partagés
  • Réglez le réseau sur Internet Sharing > Share with my Mac (c.-à-d. NAT)
  • Fixez la taille du disque à 40 Go et décochez « Split into 2GB files »
  • Désactivez la carte son
  • Désactivez « Share Bluetooth devices with Linux »

Installer le système d’exploitation invité

Démarrez la VM, installez le système d’exploitation invité et personnalisez les paramètres suivants lorsqu’ils vous sont demandés :

  • Nom d’hôte : vagrant-<distro><arch>
  • Mot de passe root : vagrant
  • Nom complet : vagrant
  • Utilisateur : vagrant
  • Mot de passe : vagrant

Configurer le système d’exploitation invité

Voici l’ensemble minimal d’étapes pour mettre en route votre système d’exploitation invité. Personnellement, je recommande de ne pas encombrer votre boîte d’extras s’ils ne sont pas nécessaires. Des paquets logiciels supplémentaires peuvent être ajoutés par un outil de provisionnement. Votre boîte de base peut ainsi être réutilisée d’un projet ou d’une équipe à l’autre.

Mettre à jour le fichier sudoers

C’est l’utilisateur vagrant qui fera tout le travail pour nous. Il doit disposer de privilèges sudo sans mot de passe et pouvoir s’exécuter sans tty (un terminal).

Comme la plupart des distributions Linux n’attribuent que l’utilisateur root au groupe sudoers, nous devons ajouter notre utilisateur vagrant au fichier sudoers. Nous devrons le faire en tant que root.

$ su -
$ visudo

Les distributions Ubuntu ajoutent à la liste sudoers l’utilisateur créé pendant l’installation. Même si cet utilisateur dispose de la permission sudo, nous devons tout de même modifier les paramètres.

Ajoutez ou modifiez les lignes suivantes au besoin :

Defaults:vagrant !requiretty
#Defaults !visiblepw
Defaults env_keep = "SSH_AUTH_SOCK"

vagrant ALL=NOPASSWD: ALL

Enregistrez les modifications et quittez votre éditeur. Quittez l’interpréteur de commandes root au besoin. L’utilisateur vagrant devrait maintenant pouvoir utiliser sudo sans mot de passe. Vérifiez-le en exécutant la commande suivante dans le Terminal :

$ sudo pwd

Mettre à jour les paquets

Il est recommandé de mettre à jour vos paquets installés à cette étape.

RHEL6

$ sudo yum update -y

Debian

$ sudo apt-get upgrade -y

Une fois les mises à jour terminées, redémarrez votre VM pour vous assurer qu’elles sont correctement appliquées. La commande suivante, exécutée dans le Terminal, redémarre immédiatement la VM :

$ sudo shutdown -r now

Télécharger la clé non sécurisée de Vagrant

Notre utilisateur vagrant utilisera une clé SSH pour obtenir un accès autorisé à la boîte.

$ mkdir -p /home/vagrant/.ssh
$ chmod 0700 /home/vagrant/.ssh
$ wget --no-check-certificate
    https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
    -O /home/vagrant/.ssh/authorized_keys
$ chmod 0600 /home/vagrant/.ssh/authorized_keys
$ chown -R vagrant /home/vagrant/.ssh

Installer et configurer OpenSSH Server

L’utilisateur vagrant accédera à la boîte et la configurera par SSH.

RHEL6

$ sudo yum install -y openssh-server
$ sudo chkconfig sshd on

Debian

$ sudo apt-get install -y openssh-server

Modifiez et mettez à jour la configuration d’OpenSSH Server.

$ sudo vi /etc/ssh/sshd_config

Ajoutez ou modifiez les lignes suivantes :

Port 22

PubKeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

PermitEmptyPasswords no
PasswordAuthentication no

Enregistrez et quittez le fichier. Redémarrez le service SSH.

RHEL6

$ sudo service sshd restart

Debian

$ sudo service ssh restart

Installer les outils invités

Les outils invités de la machine virtuelle améliorent les performances et la gestion du système d’exploitation invité. Vagrant s’en sert également pour créer des partages entre le système d’exploitation hôte et le système d’exploitation invité.

Avant d’installer les Guest Additions ou les VMware Tools, nous avons besoin de paquets de développement supplémentaires pour que les outils se compilent et s’installent correctement.

RHEL6

$ sudo yum install -y gcc make kernel-devel

Debian

# Server
$ sudo apt-get install -y gcc build-essential linux-headers-server
# Desktop
$ sudo apt-get install -y gcc build-essential linux-headers-$(uname -r)

Installez ensuite les outils invités correspondant à notre logiciel de virtualisation.

VirtualBox

Commencez par monter les Guest Additions. Sélectionnez Devices > Install Guest Additions… dans la barre de menus.

$ cd /media/VBOXADDITIONS_4.2.12_84980
$ sudo ./VBoxLinuxAdditions.run
$ sudo umount /media/VBOXADDITIONS_4.2.12_84980 | cd ~

VMware Fusion

Commencez par monter les VMware Tools en sélectionnant Virtual Machines > Install VMware Tools dans la barre de menus.

$ sudo mkdir -p /mnt/cdrom
$ sudo mount /dev/cdrom /mnt/cdrom
$ tar xzvf /mnt/cdrom/VMwareTools-9.2.2-893683.tar.gz -C /tmp
$ cd /tmp/vmware-tools-distrib/
$ sudo ./vmware-install.pl

Nettoyage

Avant d’empaqueter notre boîte, nous voulons la nettoyer afin de réduire sa taille au minimum.

RHEL6

$ sudo yum clean all

Une fois satisfait de l’état de la VM, éteignez-la pour la préparer à l’empaquetage.

$ sudo shutdown -h now

Empaqueter notre boîte

L’empaquetage de la VM crée le fichier .box décrit plus haut.

VirtualBox

Vagrant crée le fichier .box dans le répertoire où la commande vagrant package est exécutée. Si vous voulez créer cette boîte à un emplacement précis, placez-vous dans ce répertoire avant d’exécuter la commande vagrant package. Dans l’exemple ci-dessous, nous empaquetons un invité CentOS.

$ mkdir -p ~/workspace/centos64/
$ cd ~/workspace/centos64/
$ vagrant package --base vagrant-centos64

VMware Fusion

Avec VMware Fusion, l’empaquetage de notre VM demande un peu plus de travail manuel. Dans le Terminal :

  1. Rendez-vous à l’emplacement de votre fichier vmwarevm. Par défaut, il s’agit de ~/Virtual Machines/.

  2. Cliquez avec le bouton droit sur le fichier .vmwarevm et sélectionnez Show Package Contents

  3. Créez un fichier nommé metadata.json et entrez-y le contenu suivant :

{"provider": "vmware_fusion"}
  1. Créez un fichier nommé Vagrantfile et entrez-y le contenu suivant :
# -*- mode: ruby -*-
# vi: set ft=ruby

Vagrant.configure("2") do |config|

    config.vm.provider :vmware_fusion do |v, override|
        v.gui = true
    end

end
  1. Nous voulons ensuite optimiser la boîte pour réduire sa taille :
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -d Virtual Disk.vmdk
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -k Virtual Disk.vmdk
  1. Enfin, compressez la boîte :
$ tar cvzf package.box ./*

Tester le démarrage de la boîte

$ vagrant box add testbox package.box
$ vagrant init testbox
$ vagrant up

Si votre boîte fonctionne, vagrant up affichera ce qui suit.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'testbox'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant

Pour ouvrir une session sur l’invité à partir de notre hôte, nous pouvons exécuter :

$ vagrant ssh
Partager