
Gérer un parc hétérogène (Debian, RHEL, Arch) dans un seul playbook est l'un des cas d'usage les plus courants d'Ansible. Trois stratégies coexistent : le module agnostique package:, le conditionnel when: ansible_os_family == 'X', et les vars par distribution (vars/RedHat.yml, vars/Debian.yml).
Cette page compare les trois approches et donne le pattern idiomatique pour chacune.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Choisir entre
package:, conditionnels et vars par distribution. - Écrire un playbook qui installe des paquets différents selon la distrib.
- Charger des variables par OS via
include_vars:. - Détecter la famille via
ansible_os_familyetansible_pkg_mgr.
Prérequis
Section intitulée « Prérequis »- Comprendre les facts Ansible (
ansible_os_family,ansible_distribution). - Avoir lu module package.
Stratégie 1, Le module agnostique package:
Section intitulée « Stratégie 1, Le module agnostique package: »- name: Installer git (toutes distribs) ansible.builtin.package: name: git state: presentAvantage : un seul code, fonctionne partout. Limite : le nom du paquet doit être identique sur toutes les distribs. git, curl, vim, OK. apache2 (Debian) vs httpd (RHEL), KO.
Quand utiliser : paquets dont le nom est universel, playbooks simples.
Stratégie 2, Conditionnel when: sur ansible_os_family
Section intitulée « Stratégie 2, Conditionnel when: sur ansible_os_family »- name: Installer Apache sur RHEL ansible.builtin.dnf: name: httpd state: present when: ansible_os_family == 'RedHat'
- name: Installer Apache sur Debian ansible.builtin.apt: name: apache2 state: present when: ansible_os_family == 'Debian'ansible_os_family = famille d'OS, plus stable que ansible_distribution :
| Famille | Distributions |
|---|---|
RedHat | RHEL, AlmaLinux, Rocky, CentOS, Fedora |
Debian | Debian, Ubuntu, Linux Mint |
Archlinux | Arch, Manjaro |
Suse | openSUSE, SLES |
Avantage : précision maximale, accès aux options spécifiques (enablerepo:, update_cache:). Limite : verbeux dès qu'il y a plus de 2-3 paquets.
Stratégie 3, Vars par distribution (recommandé pour > 5 paquets)
Section intitulée « Stratégie 3, Vars par distribution (recommandé pour > 5 paquets) »Structure de rôle :
roles/web/├── tasks/main.yml└── vars/ ├── RedHat.yml └── Debian.ymlvars/RedHat.yml :
apache_pkg: httpdapache_service: httpdapache_user: apachevars/Debian.yml :
apache_pkg: apache2apache_service: apache2apache_user: www-datatasks/main.yml :
- name: Charger les vars de la distrib ansible.builtin.include_vars: "{{ ansible_os_family }}.yml"
- name: Installer Apache ansible.builtin.package: name: "{{ apache_pkg }}" state: present
- name: Activer Apache ansible.builtin.systemd_service: name: "{{ apache_service }}" enabled: true state: startedAvantage : tâches propres et lisibles, séparation données/logique, scalable à des dizaines de paquets. Pattern standard dans les rôles Ansible Galaxy de qualité.
Conditionnels avancés
Section intitulée « Conditionnels avancés »- name: Repos EPEL uniquement sur RHEL 9+ ansible.builtin.dnf: name: epel-release state: present when: - ansible_os_family == 'RedHat' - ansible_distribution_major_version | int >= 9ansible_distribution_major_version est une string, toujours convertir avec | int avant comparaison numérique.
Détecter le gestionnaire de paquets via ansible_pkg_mgr
Section intitulée « Détecter le gestionnaire de paquets via ansible_pkg_mgr »- name: Afficher le gestionnaire detecte ansible.builtin.debug: msg: "Gestionnaire : {{ ansible_pkg_mgr }}"ansible_pkg_mgr retourne : apt, dnf, dnf5, yum, pacman, zypper. Utile pour des assertions ou des rapports, mais le module package: l'utilise déjà sous le capot.
Pièges courants
Section intitulée « Pièges courants »Les quatre lignes tournent autour d'un même arbitrage, jusqu'où généraliser. Tester une distribution précise rate ses dérivées, se fier à la seule famille oublie qu'un membre a changé de gestionnaire de paquets, employer un nom de paquet valable ailleurs échoue franchement, et charger un fichier de variables par famille suppose que ce fichier existe pour toutes les machines du parc.
| Symptôme | Cause | Fix |
|---|---|---|
Could not find a match for 'apache2' sur RHEL | Nom de paquet Debian-only | Utiliser vars/Debian.yml + vars/RedHat.yml |
when: ansible_distribution == 'Ubuntu' rate sur Debian | ansible_distribution trop spécifique | Préférer ansible_os_family == 'Debian' |
| Erreur sur Fedora alors que play RHEL fonctionne | ansible_os_family = RedHat, mais dnf5 au lieu de dnf | Utiliser package: ou tester ansible_pkg_mgr |
include_vars ne charge rien | Fichier absent pour la distrib testée | failed_when: ou condition with_first_found: |
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »package:suffit quand le nom est universel (git,curl,vim).when: ansible_os_familypour des cas isolés ou des options spécifiques.include_vars: "{{ ansible_os_family }}.yml"= pattern standard pour rôles multi-distro.ansible_distribution_major_versionest une string,| intavant comparaison.ansible_pkg_mgrdétecte le gestionnaire :apt,dnf,pacman,zypper.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Module firewalld : l'exemple type d'outil propre à la famille RedHat, à isoler derrière une condition.
- Module SELinux : présent sur RHEL et absent ailleurs, autre branche classique d'un rôle multi-distribution.
- Module get_url : la porte de sortie quand aucun dépôt de la distribution ne fournit le binaire attendu.