Créer des scripts Ansible propres et testables avec Molecule
Cet article fait suite à l’installation d’Ansible et de Molecule. Ces deux outils sont nécessaires pour créer des scripts propres et importables facilement sur Ansible Galaxy. L’objectif de cet article : vous montrer comment démarrer un nouveau script en créant une structure de dossiers et de fichiers bien organisés. Les fichiers composant le projet seront présentés afin d’être modifiés et adaptés en fonction de vos besoins.
Création d’un nouveau rôle/projet avec Molecule
Il suffit d’utiliser la syntaxe suivante :
molecule init role -r <nom du rôle> -d <nom du driver>
- nom du rôle : le nom du nouveau projet/rôle.
- nom du driver : les drivers disponibles sont les suivant : [azure|delegated|digitalocean|docker|ec2|gce|hetznercloud|linode|lxc|lxd|openstack|podman|vagrant]
Voici un exemple de création de rôle :
molecule init role -r exemple -d docker
Le résultat obtenu est le suivant :
--> Initializing new role exemple... Initialized role in /home/jeremy/roles/exemple successfully.
Tester le rôle
Pour lancer les scripts et tester le rôle, rendez-vous dans le répertoire nouvellement créé puis lancez l’instruction suivante :
molecule test
Molecule lance différentes opérations de création, de test, de nettoyage, de validation de syntaxe, etc. Enfin, il termine par un rapport d’activité.
PLAY [Destroy] ***************************************************************** TASK [Destroy molecule instance(s)] ******************************************** changed: [localhost] => (item=instance) TASK [Wait for instance(s) deletion to complete] ******************************* FAILED - RETRYING: Wait for instance(s) deletion to complete (300 retries left). ok: [localhost] => (item=None) ok: [localhost] TASK [Delete docker network(s)] ************************************************ PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Ne vous inquiétez pas si certaines erreurs apparaissent au niveau de l’opération lint. Molecule teste la syntaxe du code ; or étant donné que c’est un projet vierge, il manque certains éléments dans les méta-données.
Lorsqu’il y a des tâches écrites, un conteneur temporaire est créé par Molecule. Si la durée de vie du conteneur est courte, il faut rapidement aller voir les conteneurs actifs. Voici un petit aperçu de conteneur créé :

Pour debuger facilement un tel script, il existe le paramètre –debug à utiliser de cette manière :
molecule --debug test
Voici un petit aperçu du rendu :
DEBUG: MOLECULE ENVIRONMENT --- MOLECULE_DEBUG: 'True' MOLECULE_DEPENDENCY_NAME: galaxy MOLECULE_DRIVER_NAME: docker MOLECULE_ENV_FILE: /home/jeremy/www/fail2ban-versions/.env.yml MOLEC
Conserver le conteneur ou la machine virtuelle
Il est possible de garder actif le conteneur ou la machine virtuelle créé·e lors du test. De cette manière, vous pouvez vérifier par vous même certains éléments. Pour que Molecule ne supprime pas l’élément crée, il faut utiliser le paramètre –destroy=never.
Voici un exemple d’utilisation :
molecule test --destroy=never
Présentation de la structure Yaml
Si vous avez navigué dans les fichiers du projet, vous avez pu constater qu’il y a beaucoup de fichier de type YAML. Avant de rentrer dans le détail de la structure d’un projet Molecule, je vous propose un petit point sur le fonctionnement d’une structure YAML.
Structure Yaml
Valeur simple
Pour créer un élément avec une seule valeur, il suffit d’utiliser cette syntaxe :
nom: valeur
Voici un exemple :
php_version: "7.2"
php_port: 80
Liste de valeurs
En fonction des besoins, il arrive que l’on ait besoin d’un élément contenant une liste de valeurs. Pour cela, il suffit de suivre la syntaxe suivante :
nom:
- valeur1
- valeur2
Il est très important de faire attention à l’indentation du texte. C’est un peu comme pour Python : il faut être très attentif au nombre d’espaces ou de tabulations.
Voici un exemple :
php_extension:
- gd
- xdebug
Tableau de clé/valeur
Pour obtenir un tableau contenant des clés/valeurs, il faut suivre la syntaxe suivante :
nom:
nom_element1: valeur_element1
nom_element2: valeur_element2
Voici un exemple :
php_config:
enable: true,
port: 8080,
group: root
Exploration de la structure de base
A présent, voyons à quoi correspond chaque répertoire et fichiers contenus à l’intérieur.
defaults/main.yml
Ce sont les constantes par défaut utilisées dans le rôle. La plupart du temps, on définit la version par défaut qui sera installée. Par exemple : php_version: « 7.2 », indique qu’on installe la version 7.2 de PHP par défaut.
handlers/main.yml
Ce sont des fonctions utilisables dans tout le rôle. L’idée, c’est d’avoir des fonctions utiles que l’on peut appeler plusieurs fois et de n’importe où. Cela évite la réécriture de code, et facilite sa maintenabilité.
Exemple de contenu dans handlers/main.yml :
- name: redemarre apache
service: name=apache2 state=restarted
Le code ci-dessus permet de faire redémarrer Apache.
Exemple d’appel de la fonction du handlers/main.yml depuis le fichier tasks/main.yml
- name: "Install dependencies"
apt:
pkg:
- git-all
state: present
notify:
- redemarre apache
Dans ce cas, après avoir installé Git, on notifie un élément précis du handler. Pour faire appel à une fonction en particulier, on utilise le nom du service que l’on souhaite appeler.
meta/main.yml
Ce fichier est simple à comprendre ; il contient divers paramètres à remplir. Ces éléments permettent de décrire le projet qui sera potentiellement envoyé sur Ansible Galaxy. Voici un extrait du contenu :
galaxy_info: author: your name description: your description company: your company (optional) # Some suggested licenses: # - BSD (default) # - MIT # - GPLv2 # - GPLv3 # - Apache # - CC-BY license: license (GPLv2, CC-BY, etc) min_ansible_version: 1.2
Répertoire Molecule
Vous pouvez y jeter un œil : il s’agit d’un répertoire géré par Molecule. Tous les paramètres passés lors de l’initialisation du projet s’y trouvent. Il y a cependant un fichier très important : molecule/default/playbook.yml. Ce fichier permet de définir les tests à effectuer pour valider les tâches du rôle. Le fichier de base contient ces lignes :
- name: Converge
hosts: all
roles:
- test
A la suite de cela, il est possible de définir les variables et les tests à effectuer.
Exemple de variable définie :
- name: Converge
hosts: all
roles:
- php_version
vars:
- php_version:
- 7.2
Exemple de test défini :
post_tasks:
- name: Check PHP version
command: "php -v | grep -F '{{ php_version }}'"
changed_when: false
Les tests se placent dans la rubrique post_tasks. Dans l’exemple ci-dessus, on vérifie que la version de PHP correspond bien à celle que l’utilisateur initial a voulu installer.
tasks/main.yml
Correspond aux tâches à faire pour construire le rôle. Si vous n’avez pas l’habitude de créer des tâches, je vous invite à lire ce précédent article.
vars/main.yml
C’est le fichier qui doit être utilisé par l’utilisateur du rôle. L’utilisateur final qui a téléchargé le rôle d’une manière ou d’une autre définit ses propres variables dans ce fichier.
Conclusion
Maintenant, vous savez comment créer un nouveau rôle proprement en y incluant des tests. Je sais… c’est un peu rude à appréhender, mais il faut s’accrocher ! Ce qui m’a beaucoup aidé au début, c’est de lire des projets déjà existants. J’en ai réalisé un après avoir appris à gérer Molecule. Je vous invite à le consulter à cette adresse.
Si vous avez des questions, les commentaires sont là pour s’entraider… Si la création de scripts pour gérer les infrastructures vous intéresse, je vous conseille de lire cet article sur les meilleures commandes avec Docker.
Sources
Je me suis aidé de quelques sites pour apprendre Molecule, je remercie les rédacteurs :
REDUISEZ VOTRE IMPACT... PARTAGEZ CET ARTICLE !
CLIQUEZ SUR LE BOUTON "JE PARTAGE" : LE POST CI-DESSUS EST AUTOMATIQUEMENT COPIÉ.
A PRESENT, RENDEZ-VOUS SUR LINKEDIN ET PARTAGEZ CE CONTENU SUR VOTRE PROFIL !