<-- retour

Créer une base box Debian sous Virtualbox pour Vagrant

Une liste impressionante de base box existent déjà sur www.vagrantbox.es. Toutefois, je n’ai pas trouvé celle qui me convient.

J’ai donc décidé de créer la mienne et pour cela la documentation de Vagrant explique parfaitement comment créer une base box.

Mon installation :

  • Mac OSX 10.9.3
  • Virtualbox 4.3.12
  • Vagrant 1.6.3

Avant toute chose, téléchargeons l’image iso d’une Debian 7 (Wheezy) (AMD64).

Ensuite, grâce à Virtualbox, créons la machine virtuelle qui servira à créer notre base box :

  • Nom : my-first-base-box
  • Mémoire : 512 MB
  • Espace disque : 50 GB (dynamiquement alloué)
  • Type : VMDK

La mémoire pourra être redéfinie dans votre Vagrantfile mais attribuez lui une valeur par défaut raisonnable. Concernant l’espace disque, définissez une place assez importante pour que l’utilisateur de la base box ne soit pas bridé. Le fait de l’allouer dynamiquement permettra de ne consommer réellement que ce qui est utilisé.

Démarrons notre machine virtuelle, sélectionnons l’iso précédemment téléchargée et installons Debian :

  • Hostname : vagrantbox
  • Domain : vagrant.com
  • Mot de passe root : vagrant
  • Nouvel utilisateur :
    • Nom complet : vagrant
    • Identifiant : vagrant
    • Mot de passe : vagrant
  • Partionnement :
    • Utilisation du disque complet
    • Tout dans une seule partition
  • Logiciels :
    • Utilitaires standard du système

Selon la documentation, le mot de passe root, le nouvel utilisateur ainsi que son mot de passe doivent être égal à “vagrant” obligatoirement.

Nous devons maintenant préparer l’environnement pour Vagrant.

Première étape, notre utilisateur vagrant doit être un sudoer sans mot de passe,

1
2
$ apt-get install sudo
$ visudo

Remplacer le contenu par :

1
2
3
4
5
6
7
8
9
10
Defaults        env_keep="SSH_AUTH_SOCK"
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%admin  ALL=(ALL) ALL
%admin  ALL=NOPASSWD: ALL

Ajoutons l’utilisateur vagrant au groupe admin,

1
2
$ groupadd admin
$ usermod -a -G admin vagrant

Nous devons ensuite mettre en place les ajouts spécifiques à Virtualbox dans la machine virtuelle,

1
2
3
4
5
6
$ apt-get autoremove virtualbox-ose-guest-dkms virtualbox-ose-guest-utils virtualbox-ose-guest-x11
$ apt-get install linux-headers-$(uname -r) build-essential
$ wget -cq http://dlc.sun.com.edgesuite.net/virtualbox/4.3.12/VBoxGuestAdditions_4.3.12.iso
$ mount -o loop,ro VBoxGuestAdditions_4.3.12.iso /mnt
$ /mnt/VBoxLinuxAdditions.run --nox11
$ umount /mnt

Ces ajouts servent à optimiser les performances, la stabilité du système, monter des dossiers partagés…

Un serveur SSH doit également être configuré pour que Vagrant puisse se connecter via la commande vagrant ssh,

1
2
3
4
5
6
7
8
9
10
$ apt-get install openssh-server openssh-client
$  echo 'UseDNS no' >> /etc/ssh/sshd_config
# On désactive les DNS au niveau de la configuration du
# serveur SSH améliorer la rapidité de connexion
$ su vagrant
$ cd ~
$ mkdir .ssh
$ wget --no-check-certificate -O .ssh/authorized_keys https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys

Vagrant est capable de provisionner une machine virtuelle grâce à Chef. Il n’est plus nécessaire de l’installer lors de la création de la base box.
Il est même préférable de passer par le plugin vagrant omnibus.

Sur le host (qui dispose de vagrant),

1
$ vagrant plugin install vagrant-omnibus

Voici un exemple de Vagrantfile utilisant omnibus pour installer la dernière version de chef,

1
2
3
4
5
6
7
8
9
Vagrant.configure("2") do |config|
  config.vm.define "my-first-vm" do |mfv|

    mfv.vm.box = "my-first-base-box"
    mfv.vm.hostname = "my-first-vm"

    mfv.omnibus.chef_version = :latest
  end
end

Notre machine virtuelle est prête. Il ne nous reste plus qu’à faire du ménage et à l’éteindre,

1
2
$ sudo apt-get clean
$ sudo poweroff

Créons la base box,

1
2
3
$ vagrant package --base my-first-base-box
# coffee time!
$ mv package.box my-first-base-box.box

Testons maintenant cette fameuse base box,

1
2
3
4
5
6
$ vagrant box add my-first-base-box my-first-base-box.box
# coffee time!
$ mkdir test
$ cd test
$ vagrant init my-first-base-box
$ vagrant up