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 apt, Ansible 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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn