Système de provisioning au sein d'ITNetwork

2019-01-07 | Emeric Darne

image article

Avant toute chose, commençons par expliquer ce qu’est le provisioning afin de comprendre l’intérêt que peut y porter notre entreprise.

Qu’est ce que le provisioning ?

Le provisioning c’est l’automatisation de tâches allant de l’installation d’un environnement de développement à la mise en place d’infrastructures de production. Il permet d’installer des outils, librairies, bundles... afin de garantir que notre environnement soit pleinement opérationnel.

ATTENTION ! Il ne faut pas confondre provisioning et déploiement applicatif. En effet bien qu’il soit possible de déployer des applications avec des outils de provisioning, ceux-ci vont beaucoup plus loin puisqu’ils assurent la disponibilité de l’environnement technique d’une application.

Quel est l'intérêt de mettre en place du provisioning ?

Pour répondre à cette question, je vais vous en poser une autre. Combien de fois vous est-il arrivé d’avoir une fonctionnalité qui marche parfaitement sur un environnement de test, mais une fois envoyée en production, celle-ci renvoie une erreur ?

La réponse est simple :

“BEAUCOUP !”

Et si vous demandez les raisons, vous aurez des retours du type :

“J’ai oublié d’installer un composant sur le serveur de production”

“Je n’ai pas donné les bons certificats”

“J’ai oublié de configurer une librairie/composant”.

Il était important de pallier à ce problème au sein d’ITNetwork, c’est pourquoi nous avons mis en place le provisioning afin de résoudre ce problème récurrent auquel nous étions régulièrement confrontés. Nous avons désormais automatisé l’installation de nos machines et mis de côté ce type de retours négatifs. Un environnement de test sera le plus identique possible à un environnement de production. Si une fonctionnalité d’une application marche en environnement de test, elle marchera en production (si il y a une erreur, ce sera plutôt côté applicatif).

Et si ce n’était pas seulement une question d’environnement identique...

En effet, le provisioning apporte également un gain de temps assez conséquent en plus de résoudre d'éventuels problèmes de disparité des environnements. Si un serveur est victime d’une coupure de courant à long termes, pris dans un incendie/inondation ou défaillant, c’est généralement la panique car toutes les applications étant hébergées sur ce serveur sont inaccessibles et donc inutilisables. Il faut remonter un serveur en urgence afin de pouvoir héberger les applications afin qu’elles soient opérationnelles dans les plus brefs délais. Si vous ne disposez pas de système de provisioning ou d’image de votre configuration (gardez dans un coin de votre tête cette notion d’image), il est très difficile de remettre un serveur à l’état identique de celui qui vient de rendre l’âme. Vous allez reprendre le papier (si il y en a un) que vous avez utilisé lors de la première installation, et réinstaller tout à la main étape par étape, configurer, puis déployer votre application. Vous allez probablement oublier que vous aviez noté qu’une librairie a été ajoutée pour une fonctionnalité 3 mois après l’installation initiale. Il est également possible de faire une faute de frappe dans un fichier de configuration. Tous ces problèmes potentiels vont amener à ce que votre application soit inutilisable une fois déployée. De plus, je ne compte pas le temps que cela va vous prendre de réinstaller les outils à la main et de les configurer de la même manière qu’ils étaient avant la défaillance du serveur… Tout faire à la main est donc à proscrire.

Revenons à cette histoire d’image dont je vous ai parlé plus haut… Il est en effet facile de remonter un serveur via une image, et donc pas besoin de s'embêter à mettre en place un système de provisioning qui va prendre du temps à développer. Une fois mon serveur complètement installé, j’en fais une image, si le serveur est défaillant, il me suffit d'appliquer l’image sur un nouveau serveur, de déployer mon application et le tour est joué !

En effet, mais... que se passe t’il si on oublie qu’une personne tierce a ajoutée une librairie et qu’elle n’a pas recréé l’image du serveur ? La prochaine fois que l’on monte l’image du serveur, la librairie manquante ne sera pas installée, l’application risque d’avoir quelques problèmes… Ceci étant dit, il en est de même pour le provisioning, une fois provisionné, si une personne ajoute manuellement quelque chose sur le serveur. Lors d’un prochain provisioning, l’ajout ne sera pas pris en compte. C’est pour ça que nous travaillons toujours sur notre outil de provisioning à ITNetwork si nous devons mettre à jour la configuration de nos serveurs ! Rien n’est modifié manuellement sur le serveur, absolument rien. Et ceci est nécessaire afin de pouvoir remonter un serveur identique au premier en quelques minutes.

Certains diront :

“Oui enfin il suffit de faire une image à chaque fois qu’on fait une modification… pas besoin de monter tout un système de provisioning, il suffit d’être rigoureux !”.

Oui c’est vrai, mais allez-vous être rigoureux tout le temps ? Si une ou plusieurs personnes tierce entrent en jeu ? Je vous souhaite bon courage.

Mais que se passe-t-il si 5 de vos serveurs nécessitent une mise à jour d’une même librairie et d’une reconfiguration pour faire tourner les applications ? Vous allez changer chaque serveur manuellement, les mettre à jour, puis recréer des images des 5 serveurs ? La tâche va être répétitive, probablement ennuyeuse, et quelle est la probabilité que vous oubliez une étape…

Sinon, vous avez un système de provisioning, vous faîtes la modification de librairie sur le système de provisioning, vous lancez une commande, et tous les serveurs utilisant cette librairie vont être mis à jour automatiquement. De même, si vous souhaitez monter un nouveau serveur pour une application différente, la librairie sera également à jour. Après l’utilisation d’un système de provisioning, il vous est difficile de vous dire comment vous feriez sans.

Quel outil de provisioning choisir pour automatiser ?

Il existe une multitude d’outils, les plus connus étant “Ansible”, “Chef”, “Puppet”... Nous avons fait le choix de ”Chef” chez ITNetwork car c'est une solution mature, disposant d'une bonne documentation et d'une large communauté. De plus, l’un d’entre nous disposait d’une expérience sur cet outil. Vous trouverez des atouts et des inconvénients sur tous ces outils en ligne.

Le provisioning et la virtualisation ?

Il est très facile de virtualiser les environnements de développement avec “Chef” et “Vagrant” (un logiciel permettant de configurer des environnements de développement virtuel). Nous pouvons donc monter des machines virtuelles opérationnelles très rapidement afin de pouvoir déployer des applications.

Grâce à notre système de provisioning, nous avons automatisé l’installation et la configuration de nos outils utilisés pour faire tourner nos différentes applications. Certaines applications nécessitent des choses plus ou moins spécifiques, qui sont elles aussi prises en charge par notre système.

Que nous permet d’installer notre système utilisant “Chef” ?

Notre système de provisioning nous permet de nous adapter en fonction du type d’attente d’une application. Nous pouvons installer différents type de librairies, sous différentes versions, afin d’avoir un environnement prêt pour que nos applications soient déployées. Voici une liste non exhaustive de divers outils que l’on peut installer et configurer via notre système de provisioning, sachant que notre coeur de domaine est des applications nécessitant un environnement LAMP (Linux Apache MySQL PHP) :

  • Apache2
  • MySQL ou MariaDB (et Redis si nécessaire)
  • Création des bases de données
  • PHP5 ou PHP7
  • Préparer la structure du serveur en fonction du type d’application qu’il va héberger (Symfony1/ Symfony2/ Symfony3+/ Wordpress…)
  • Utilisateurs à créer sur le serveur
  • Système de CRONs avec commandes et périodicités
  • Gestion des daemons
  • HTTPS ou non (via des certificats générés par Letsencrypt)
  • Backup des applications envoyés directement sur un cloud
  • Création des VirtualHosts pour préparer les applications
  • Monitoring afin d’avoir un suivi du serveur (Alerting RAM/Disque/CPU envoyé sur notre outil de communication interne Slack...) En savoir plus sur notre système de monitoring

Ces outils ont été plus ou moins fastidieux à mettre en place. Certains méritent d’avoir beaucoup plus de configurations que d’autres et se doivent d’être bien plus flexibles afin d’être adaptables selon le type d’applications à héberger.

Si l'on prend pour exemple le provisioning le plus récurrent chez ITNetwork, celui d'un serveur amené à héberger une application Symfony. Notre système, en plus d'installer et de configurer les éléments listés ci-dessus, va permettre d'implémenter des crons spécifiques pour les commandes de Symfony. Il va également mettre en place les extentions PHP spécifiques pour le bon fonctionnement d'une application Symfony. Dans la majorité des cas, pour les applications Symfony3+, nous utilisons ReactJS pour gérer l'interface, le système de provisioning va nous mettre à disposition 'Node.js' et 'Yarn' afin de gérer nos paquets. Bien entendu, toutes ces installations spécifiques pour une application Symfony, restent configurables et tiennent compte de la version du système d'exploitation utilisé sur le serveur.

En quelques mots...

Notre système de provisioning a nécessité plusieurs heures de réflexion en interne, des heures et des heures de mises en place et de tests, mais aujourd’hui nous ne pouvons pas nous imaginer sans. Pouvoir installer et configurer des machines en quelques minutes, dans l’état que l’on souhaite, prêt à accueillir nos applications, étant monitorées et ayant la possibilité d’être mises à jour à la volée de manière groupée.

Vous pouvez également aller consulter une petite conférence que j'ai réalisé en 2017 lors d'un rassemblement de l'association Clermont'ech effectuée sur Chef : Cliquez ici pour accéder à la vidéo YouTube

Chef Provisioning Automation Automatisation ReactJS