Nouveau driver VirtualBox pour Cloudify

Je travaille beaucoup avec Cloudify ces derniers temps: ce produit merveilleux me permet de déployer un cluster MongoDB ou Hadoop en quelques minutes (et pas en quelques heures ou jours…)
Je réalise pas mal de présentations sur ces sujets, avec des démos, donc j’ai besoin de créer de nouveaux clusters très rapidement.
Grâces au Cloud et aux IaaS comme Amazon EC2, je peux déployer un gros cluster avec de nombreux serveurs. Mais pour cela, il me faut une connexion internet chez le client chez qui je fait la démo: et ça, c’est mission impossible!

Cloudify permet de créer un Cloud local sur mon portable, mais cela pose quelques problèmes:

  • Je suis sous MacOS X, et certaines Recipes ne fonctionnent que sous Linux
  • Quand je créé un cluster MongoDB, et que j’utilise le même port pour chaque instances, ce n’est pas un problème si ces instances sont sur des machines différentes… mais avec le « Cloud local », j’ai des conflits de ports…
  • etc.

J’ai alors décidé de créer un vrai Cloud sur mon portable pour pouvoir faire mes démos sans connexion Internet. Ainsi, je peux simuler un déploiement proche de la réalité.
Mon portable possède 16Go de RAM, donc je peux créer plusieurs machines virtuelles (pas trop non plus, mais assez pour une démo).
Pour ce faire, j’ai d’abord essayé d’installer OpenStack, mais c’est plutôt complexe à installer/configurer, surtout sur MacOS.

En même temps, quand j’ai besoin de faire des choses spécifiques qui nécessitent un OS Linux, j’utilise Vagrant.
Vagrant est génial: il me permet de créer une nouvelle VM à partir d’un template, et la configurer à l’installation grâce à un script de bootstrap.
Pour créer les VM, Vagrant utilise VirtualBox, et ils existent de nombreuses « boxes » (template de VM, similaire à des AMI Amazon): http://www.vagrantbox.es/

En fait, je peux même créer plusieurs VM avec Vagrant, et exécuter Chef ou Puppet comme script de bootstrap…
Donc en théorie, je peux déployer un cluster MongoDB/Hadoop avec Vagrant.
Mais ce n’est pas aussi puissant que Cloudify:

  • Vagrant ne fournit pas un contexte global au déploiement, donc on ne peut pas faire de dépendances entre les services
  • Vagrant ne fournit pas de monitoring, de gestion du fail-over ou de l’auto-scaling
  • Vagrant ne peut créer des VM que sur la machine local, pas sur un serveur distant
  • Il y a plein de limitations au niveau des scripts de déploiement, c’est pourquoi Cloudify utilise Chef/Puppet, et que ces derniers ne remplacent pas Cloudify

Suite à ça, j’ai décidé d’implémenter mon propre driver VirtualBox pour Cloudify: je conserve la puissance de Cloudify, mais je peux simuler un réel déploiement (avec des VM Linux, etc.). Et surtout: je peux faire tout ça sur mon portable sans connexion Internet!

Vous pouvez trouver ce driver sur Github: https://github.com/fastconnect/virtualbox-cloudify-driver

Pour l’utiliser, il vous suffit de l’ajouter dans le « overrides package » de Cloudify (voir la documentation de Cloudify) et de configurer le driver comme expliqué dans le Readme.

Ce driver utilise le WebService de VirtualBox, il y a donc quelques prérequis:

  • Après avoir installé VirtualBox, il faut créer une « HostOnlyInterface » qui sera utilisée par les VMs de Cloudify
  • Il faut aussi configurer le WebService pour ne pas utiliser l’authentification: VBoxManage setProperty websrvauthlibrary null
  • Ensuite, démarrez le WebService: vboxwebsrv
  • Téléchargez une « box » depuis http://www.vagrantbox.es/, et placez la dans un répertoire qui va contenir toutes vos « boxes »
  • Enfin, configurez le driver. Il faut spécifier le chemin du répertoire qui contient les « boxes », il faut donner le nom de la « HostOnlyInterface », et il faut spécifier l’URL du WebService.ATTENTION: l’URL du WebService doit utiliser l’IP de la HostOnlyInterface, car elle doit être accessible par la VM qui va contenir le Manager de Cloudify

Si vous avez suivi ces étapes correctement, vous devriez pouvoir créer un Cloud « local » avec VirtualBox!

Comme le driver utilise le WebService de VirtualBox, ce dernier peut se trouver sur un serveur dédié.
VirtualBox n’est pas un vrai IaaS comme OpenStack, mais ça peut suffire dans certains cas, et vous pouvez installer une interface Web d’administration (http://code.google.com/p/phpvirtualbox/).

Lors de la réalisation de ce driver, j’ai rencontré un gros problème: je n’ai pas de serveur DNS pour mes machines virtuelles.
Ce qui veut dire que les VMs n’arrivent pas à se connaitre et communiquer entre elles.
Du coup, le driver configure la machine virtuelle juste après sa création: il configure la carte réseau, change le hostname et change le /etc/hosts.
Pour ce faire, il utilise le « VirtualBox Guests Addition », qui doit donc être installé sur les templates de VM (ce qui est le cas avec les « boxes », car Vagrant en a aussi besoin).
Avec ce « Guests Addition », un agent VirtualBox s’exécute au démarrage de la machine, et on peut l’utiliser pour effectuer des opérations comme la création de répertoires, ou l’exécution de programmes.

La bonne nouvelle, c’est que grâce à cet agent, on peut effectuer les mêmes opérations peut importe l’OS (Windows, Linux, etc.).
La mauvaise, c’est que le processus de configuration du réseau est différent suivant l’OS, et n’est pas le même sur Linux et Windows.
Pour le moment, le driver utilise des chemins et des commandes Linux (sed, etc.).
Du coup, le driver ne fonctionne que pour des machines virtuelles Linux, et il n’a été testé qu’avec Ubuntu

Le driver est OpenSource (APL), donc vous pouvez contribuer et ajouter vous même le support des VM Windows ! (et tester sur d’autres distributions Linux)

J’espère que ce driver puisse vous être utile, et puisse vous aidez à tester Cloudify sur votre poste local!
Vous pouvez trouver d’autres informations techniques sur le README sur Github:
https://github.com/fastconnect/virtualbox-cloudify-driver
Vous pouvez télécharger ce driver depuis notre repository Maven OpenSource.