Test-driven development sur votre infrastructure avec ansible – Compte-rendu du talk de Sebastián Caceres et Tanguy Patte à La Duck Conf 2020
Dans ce talk, Sebastián et Tanguy nous expliquent comment faire du TDD sur du code d'infrastructure avec ansible. L’infrastructure as Code devenant la norme pour la création d’infrastructure, nous souhaiterions profiter des bonnes pratiques du Software Craftsmanship pour garantir un code d’infrastructure de qualité.
TDD
Une des pratiques associée au Software Craftsmanship est le TDD ou Test Driven Development. Pour rappel cette pratique consiste à :
- Ecrire un test.
- Vérifier qu’il échoue.
- Ecrire le code pour faire passer ce test.
- Vérifier qu’il passe.
- Remanier le code pour le rendre plus lisible, plus maintenable si besoin avant de reprendre un nouveau cycle.
Ansible
Tout d'abord ils nous font un rappel sur les principes d'ansible, un outil agentless de gestion de configuration. Le mécanisme fonctionne avec une machine de contrôle qui se connecte en ssh vers les machines cibles.
Le code ansible est divisé en trois parties :
- L’inventaire qui répertorie les machines à configurer et les regroupe.
- Les rôles qui représentent les tâches à exécuter sur les machines.
- Les playbooks qui définissent quels rôles vont être joués sur les machines de l’inventaire.
Un des problèmes frequents rencontré lors de l’utilisation d’ansible est que lorsque l’on supprime du code ansible, notre code ne reflétera plus la réalité de notre infrastructure.
Pour palier ce problème, il est possible de reconstruire un environnement de zéro :
- provisionner de l’infrastructure.
- configurer cette infrastructure.
- lancer des tests.
- supprimer l'infrastructure créée.
Avec ce workflow, la boucle de feedback est assez longue en fonction de la taille de l'infrastructure, et il peut être difficile de travailler sur celle-ci à plusieurs.
La solution est de tester sur une infrastructure réduite et en local, pour réduire le périmètre et avoir une boucle de feedback rapide. Pour ce faire on peut utiliser molecule.
Molecule
Molecule est un outil python utilisant ansible et testinfra permettant de tester notre code ansible sur une infrastructure locale, réduite et éphémère. Il utilise docker par défaut pour simuler l'infrastructure, car l'instanciation d'un conteneur est plus rapide que celle d'un serveur.
Lors de la conférence, Tanguy et Sebastián, nous ont proposé une démo en live pour étayer leur propos, avec plusieurs cycles de TDD.
Et pour finir, ils nous ont parlé des limites de molecule :
- pour avoir une boucle de feedback rapide, on favorise l’utilisation de docker au lieu de machine virtuelle. Néanmoins, un conteneur est différent d’un serveur ce qui peut poser des problèmes dans certains cas.
- il est assez compliqué de mocker des appels à des services externes.
Take away
On peut retenir 3 choses :
- Ne pas s'attacher aux outils et être prêt à en changer, mais garder la mentalité d’écrire des tests.
- Ne pas perdre ses pratiques de TDD sur de l'infrastructure as code, ce n’est pas simple, mais il existe de plus en plus de moyen de tester.
- De nouveaux outils de test d'infrastructure voient le jour fréquemment, ne pas hésiter à les tester et partager ses expériences pour toujours faire mieux.
Si vous souhaitez en savoir plus , voici l’article de Sébastián sur le sujet et le talk .