XinCTO/des box privées avec vagrant

Ecrit le Wed, 28 November 2018 16:05:24 +0000
892 mots 5 minutes

des box privées avec vagrant

Vagrant est l’outil de déploiement automatique d’environnement pour des développeurs. Simple d’usage il autorise de monter rapidement une petite infrastructure sur son poste de travail à partir d’image de base (des box) et de post-processing de configuration.

Ce petit billet pour partager avec vous la façon dont on construit des box pour ses usages propres et éventuellement pour ses développeurs et partenaires préférés.

J’ai déjà eu l’occasion de partager avec vous deux notes sur l’utilisation de vagrant avec virtualbox (cf démarrer avec vagrant et virtualbox) et pour monter un cluster swarm (cf vagrant multi noeuds pour swarm), c’est dans le cadre du montage d’un cluster k8s que j’ai expérimenté l’utilisation des box et bien que cela ne soit pas compliqué, la documentation n’est pas simple à exploiter.

Introduction

L’intérêt premier des box vagrant est de gagner du temps. En effet la configuration à postériori à base d’un ansible local est assez longue, pas de parallélisation des actions, certaines sont longues à executer, certaines nécessitent de télécharger des composants à installer et sur son poste de travail, or sans un accès simple à un repository en local avec l’ensemble de la distribution à jour il faut solliciter le réseau.

En revanche, créer une machine avec virtualbox à partir d’une box vagrant est assez rapide et peu dépendant de son contenu, seul la taille des volumes peut jouer. Donc, autant optimiser les travaux, notamment lorsque l’infrastructure de test nécessite plusieurs serveurs, virtualbox ne supportant pas l’installation en parallèle, l’impact en temps est notable.

Une box est une image virtualbox (dans ce cas) préparée et qui peut donc être utilisée pour les créations suivantes via la directive config.vm.box.

Construction

Avant toute chose, il vous faut une image virtualbox déjà construite, peut importe la façon dont celle-ci a été mise en place, avec vagrant, à partir d’une image ISO ou tout autre méthode. Les trois phases pour construire une nouvelle box sont :

  • créer un fichier info.json avec les informations nécessaire à notre nouvelle box (nom, version, …). Le nom du fichier importe peu, on pourra également le nommer metadata.json.
  • faire une image de notre VM virtualbox
  • préparer la box à partir de l’image et des meta données

info.json

Le fichier de metadata permet d’enrichir la box avec des informations complémentaires et surtout de gérer les versions. Elle permet également de construire plusieurs formats différents de la même box pour des providers différents (ie virtualbox, VmWare, Hyper-V), dans notre cas ceci n’est pas utile. S’il fallait aller vers du multi-cloud pour de l’orchestration, on préférerait probablement l’outil packer, mais on quitte les besoins du développement (ou de la formation, test, …) et c’est une autre histoire.

Vous trouverez un peu de documentation sur le format du fichier dans la section Box Metadata. Voici un exemple :

 1{
 2  "name": "xincto/docker",
 3  "description": "minimal docker version",
 4  "versions": [
 5    {
 6      "version": "1811.04",
 7      "providers": [
 8        {
 9          "name": "virtualbox",
10          "url": "package.box"
11        }
12      ]
13    }
14  ]
15}

Les informations importantes sont :

  • ligne 2 : le nom de la box qui sera utilisé ultérieurement pour construire des VM sur cette base
  • ligne 6 : la version (permet de disposer de plusieurs versions pour assurer le roll-back simplifié), indispensable pour que les utilisateurs soient autonomes
  • ligne 10 : le fichier contenant l’image source de la VM

créer l’image de notre VM

Après vérification de son bon fonctionnement, on demande la création d’un package avec la commande vagrant package (par défaut le fichier package.box sera crée avec virtualbox), l’opération prend quelques minutes et peut se faire machine allumée, vagrant prendra soin de l’éteindre proprement.

1>vagrant package
2==> docker01: Attempting graceful shutdown of VM...
3==> docker01: Clearing any previously set forwarded ports...
4==> docker01: Exporting VM...
5==> docker01: Compressing package to: package.box

créer la box

Sur la base du fichier package et des metadata, on demande la création d’une box avec la commande vagrant box add info.json, l’opération est assez rapide :

1>vagrant box add info.json
2==> box: Loading metadata for box 'info.json'
3    box: URL: file:info.json
4==> box: Adding box 'xincto/docker' (v1811.04) for provider: virtualbox
5    box: Downloading: package.box
6    box: Progress: 100% (Rate: 754M/s, Estimated time remaining: --:--:--)
7==> box: Successfully added box 'xincto/docker' (v1811.04) for 'virtualbox'!

La box ainsi crée apparaît dans l’inventaire et est directement utilisable dans un prochain script vagrant. Elle apparaît ci-dessous en ligne 4 :

1>vagrant box list -i
2centos/7      (virtualbox, 1809.01)
3xincto/docker (virtualbox, 1811.03)
4xincto/docker (virtualbox, 1811.04)
5xincto/k8s    (virtualbox, 1811.02)

Utilisation

On retombe ici dans l’utilisation standard de vagrant, il suffit de demander la création d’une nouvelle VM sur la base d’une image de notre inventaire (ie xincto/docker), on pourra spécifier la version (dernière par défaut) avec l’option config.vm.box_version. A noter que les box sont en local sur le poste de l’utilisateur (dans ~/.vagrant.d/boxes) mais peuvent être mises à disposition sur un serveur web et rendues accessibles via l’option config.vm.box_url.

Vagrant.configure("2") do |config|
	config.vm.box = "xincto/docker"
	config.vm.synced_folder ".", "/vagrant", type: "rsync"

Conclusion

Usez et abusez des box vagrant, que ce soit pour votre usage personnel mais surtout pour vos développeurs, infogérants, partenaires afin qu’ils utilisent le plus possible vos solutions, vos environnements de travail et puisse produire à vos côtés avec des versions que vous maîtrisez.

Ceci va dans le sens de l’infrastructure immuable et va donc vous simplifier la vie.

Photo from Clem Onojeghuo