Aller au contenu
Infrastructure as Code medium

Scenarios Molecule multi-distribution : tester sur Rocky, AlmaLinux, Debian

8 min de lecture

Logo Ansible

Tester un rôle sur une seule distro est un faux test. Ce qui passe sur Rocky 9 plante peut-être sur Debian 12 (nom de paquet, chemin filesystem, user système, syntaxe systemd). Cette page vous fait étendre la matrice Molecule à 3 distros (Rocky 9, AlmaLinux 10, Debian 12) en parallèle, et adapter le rôle webserver à la portabilité avec le pattern vars/<os_family>.yml.

  • Configurer plusieurs platforms: dans molecule.yml.
  • Créer vars/RedHat.yml et vars/Debian.yml pour les variables OS-spécifiques.
  • Charger dynamiquement les vars via include_vars: "{{ ansible_os_family }}.yml".
  • Utiliser le module package (agnostique) au lieu de dnf/apt.
  • Lancer molecule test et voir le rôle valider 3 distros en parallèle.
---
dependency:
name: galaxy
driver:
name: default
platforms:
- name: rocky9
image: docker.io/rockylinux/rockylinux:9
pre_build_image: true
privileged: true
command: /sbin/init
groups:
- rhel_family
- name: alma10
image: docker.io/almalinux/10-init:latest
pre_build_image: true
privileged: true
command: /sbin/init
groups:
- rhel_family
- name: debian12
image: docker.io/geerlingguy/docker-debian12-ansible:latest
pre_build_image: true
privileged: true
command: /lib/systemd/systemd
groups:
- debian_family
provisioner:
name: ansible
verifier:
name: ansible

3 platforms = 3 instances créées en parallèle. Le groups: permet de cibler depuis verify.yml les instances par famille.

Différence Debian : le PID 1 est /lib/systemd/systemd (pas /sbin/init comme RHEL).

roles/webserver/vars/RedHat.yml
---
__webserver_package_name: nginx
__webserver_service_name: nginx
__webserver_html_dir: /usr/share/nginx/html
__webserver_user: nginx
roles/webserver/vars/Debian.yml
---
__webserver_package_name: nginx
__webserver_service_name: nginx
__webserver_html_dir: /var/www/html # ← différent de RHEL
__webserver_user: www-data # ← différent de RHEL

Mêmes clés, valeurs différentes selon l’OS.

# tasks/main.yml — pattern multi-distro
---
- name: Charger les variables spécifiques à la distribution
ansible.builtin.include_vars: "{{ ansible_os_family }}.yml"
- name: Installer nginx (module agnostique)
ansible.builtin.package:
name: "{{ __webserver_package_name }}"
state: present
- name: Déployer la page d'accueil
ansible.builtin.copy:
dest: "{{ __webserver_html_dir }}/index.html"
content: "{{ webserver_index_content | default('Hello') }}\n"
mode: "0644"
- name: Démarrer le service
ansible.builtin.systemd_service:
name: "{{ __webserver_service_name }}"
state: started
enabled: true

Points clés :

  1. include_vars: "{{ ansible_os_family }}.yml" charge dynamiquement RedHat.yml ou Debian.yml selon le fact ansible_os_family.
  2. ansible.builtin.package (agnostique) au lieu de dnf ou aptAnsible détecte le bon gestionnaire.
  3. Toutes les variables OS-spécifiques sont préfixées __webserver_ (internes, non override-ables).
- name: Verify
hosts: all
gather_facts: true
become: true
tasks:
- name: Charger les vars distro pour la vérif
ansible.builtin.include_vars: "../../roles/webserver/vars/{{ ansible_os_family }}.yml"
- name: Vérifier que nginx est installé
ansible.builtin.package_facts:
- name: Assertion paquet nginx présent
ansible.builtin.assert:
that:
- "'nginx' in ansible_facts.packages"
fail_msg: "nginx absent sur {{ ansible_distribution }}"
- name: Vérifier la page d'accueil
ansible.builtin.slurp:
src: "{{ __webserver_html_dir }}/index.html"
register: index
- name: Assertion contenu page
ansible.builtin.assert:
that:
- "'Hello' in (index.content | b64decode)"

__webserver_html_dir est différent par OS — l’assertion teste le bon path automatiquement.

Fenêtre de terminal
molecule test

Sortie (résumé) :

PLAY RECAP **********************************************************
rocky9 : ok=8 changed=4 unreachable=0 failed=0
alma10 : ok=8 changed=4 unreachable=0 failed=0
debian12 : ok=8 changed=4 unreachable=0 failed=0
INFO Verifier completed successfully on rocky9
INFO Verifier completed successfully on alma10
INFO Verifier completed successfully on debian12

3 distros, 3 verts. Le rôle est validé portable. Si Debian échouait, vous saurez immédiatement qu’il y a un problème de portabilité — pas en 6 mois quand un client Debian arrive.

Fenêtre de terminal
molecule test --platform-name rocky9 # uniquement Rocky 9

Pratique pour debugger un échec ciblé sans relancer les 3.

Cette page a un lab d’accompagnement : labs/molecule/scenarios-multi-distro/ dans stephrobert/ansible-training.

Le lab fournit la matrice 3 distros + le rôle webserver portable + 7 tests structure (vars RedHat/Debian, include_vars dynamique, module package, divergence des HTML dirs).

Fenêtre de terminal
cd ~/Projets/ansible-training/labs/molecule/scenarios-multi-distro/
pytest -v challenge/tests/ # 7 tests structure
SymptômeCauseFix
nginx absent sur DebianPas de update_cache aptAjouter pre_tasks qui fait update_cache: true sur Debian
package_facts ignoréModule pas dans builtin RHEL minimalOK — il est dans ansible.builtin depuis 2.10
Permission denied sur __webserver_html_dirOwner différent (nginx vs www-data)Utiliser __webserver_user au lieu de hardcoder
Test rate sur 1 distroVariable manquante dans vars/<distro>.ymlVérifier que les MÊMES clés existent dans tous les vars/
Container Debian ne démarre pascommand: /sbin/init au lieu de /lib/systemd/systemdAdapter le command: selon l’image
  • platforms: liste = matrice de test parallèle.
  • vars/<os_family>.yml + include_vars dynamique = pattern multi-distro standard.
  • ansible.builtin.package > dnf:/apt: quand le nom du paquet est universel.
  • 3 distros minimum recommandé pour un rôle publié : Rocky/Alma + Debian.
  • Test échec sur 1 seule distro = drift OS détecté immédiatement.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn