
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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Configurer plusieurs
platforms:dansmolecule.yml. - Créer
vars/RedHat.ymletvars/Debian.ymlpour les variables OS-spécifiques. - Charger dynamiquement les vars via
include_vars: "{{ ansible_os_family }}.yml". - Utiliser le module
package(agnostique) au lieu dednf/apt. - Lancer
molecule testet voir le rôle valider 3 distros en parallèle.
Prérequis
Section intitulée « Prérequis »- Molecule installé avec
molecule-plugins[podman]. - Avoir suivi Cycle TDD complet.
Le molecule.yml multi-distro
Section intitulée « Le molecule.yml multi-distro »---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: ansible3 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).
vars/RedHat.yml et vars/Debian.yml
Section intitulée « vars/RedHat.yml et vars/Debian.yml »---__webserver_package_name: nginx__webserver_service_name: nginx__webserver_html_dir: /usr/share/nginx/html__webserver_user: nginx---__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 RHELMêmes clés, valeurs différentes selon l’OS.
Charger les vars dynamiquement
Section intitulée « Charger les vars dynamiquement »# 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: truePoints clés :
include_vars: "{{ ansible_os_family }}.yml"charge dynamiquement RedHat.yml ou Debian.yml selon le factansible_os_family.ansible.builtin.package(agnostique) au lieu dednfouapt— Ansible détecte le bon gestionnaire.- Toutes les variables OS-spécifiques sont préfixées
__webserver_(internes, non override-ables).
Le verify.yml adapté
Section intitulée « Le verify.yml adapté »- 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.
Lancer le test sur les 3 distros
Section intitulée « Lancer le test sur les 3 distros »molecule testSortie (résumé) :
PLAY RECAP **********************************************************rocky9 : ok=8 changed=4 unreachable=0 failed=0alma10 : ok=8 changed=4 unreachable=0 failed=0debian12 : ok=8 changed=4 unreachable=0 failed=0
INFO Verifier completed successfully on rocky9INFO Verifier completed successfully on alma10INFO Verifier completed successfully on debian123 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.
Cibler une distro spécifique
Section intitulée « Cibler une distro spécifique »molecule test --platform-name rocky9 # uniquement Rocky 9Pratique pour debugger un échec ciblé sans relancer les 3.
Pratiquer dans le lab
Section intitulée « Pratiquer dans le lab »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).
cd ~/Projets/ansible-training/labs/molecule/scenarios-multi-distro/pytest -v challenge/tests/ # 7 tests structurePièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
nginx absent sur Debian | Pas de update_cache apt | Ajouter pre_tasks qui fait update_cache: true sur Debian |
package_facts ignoré | Module pas dans builtin RHEL minimal | OK — il est dans ansible.builtin depuis 2.10 |
Permission denied sur __webserver_html_dir | Owner différent (nginx vs www-data) | Utiliser __webserver_user au lieu de hardcoder |
| Test rate sur 1 distro | Variable manquante dans vars/<distro>.yml | Vérifier que les MÊMES clés existent dans tous les vars/ |
| Container Debian ne démarre pas | command: /sbin/init au lieu de /lib/systemd/systemd | Adapter le command: selon l’image |
À retenir
Section intitulée « À retenir »platforms:liste = matrice de test parallèle.vars/<os_family>.yml+include_varsdynamique = 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.