Accueil Technologies Créer des scripts Ansible propres et testables avec Molecule
Créer des scripts Ansible propres et testables avec Molecule

Créer des scripts Ansible propres et testables avec Molecule

par Jérémy PASTOURET

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éé :

Instance Docker avec Ansible

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

Structure de base d'un role avec Molecule

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 :

Vous pourriez aussi aimer

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.