Aller au contenu
Infrastructure as Code medium

Module package Ansible : installation agnostique multi-distro

6 min de lecture

Logo Ansible

ansible.builtin.package installe des paquets de manière agnostique : Ansible détecte automatiquement la distribution (ansible_pkg_mgr) et appelle dnf: sur RHEL, apt: sur Debian, pacman: sur Arch, zypper: sur SUSE. Idéal pour des rôles multi-distros.

Sur un parc 100% RHEL/RockyLinux/AlmaLinux, préférer dnf: qui expose des options spécifiques (enablerepo, security, bugfix).

  • Quand utiliser package: (multi-distro) vs dnf:/apt: (mono-distro avec options).
  • Les 3 valeurs de state: : present, latest, absent.
  • Comment installer plusieurs paquets en une tâche (liste vs boucle).
  • Le piège state: latest sur des paquets critiques (mises à jour non maîtrisées).
  • Avoir un managed node avec become: true configuré.
  • Connaître la syntaxe d’un play (cf. Plays et tasks).
- name: Installer vim-enhanced
ansible.builtin.package:
name: vim-enhanced
state: present

state: present est le défaut — n’installe que si absent. Si déjà installé, la tâche est ok (pas changed). C’est l’idempotence par défaut de package:.

Liste de paquets — une seule tâche, plusieurs paquets

Section intitulée « Liste de paquets — une seule tâche, plusieurs paquets »
- name: Installer plusieurs paquets en une fois
ansible.builtin.package:
name:
- vim-enhanced
- bash-completion
- tree
- htop
state: present

Bien plus efficace qu’une boucle : Ansible fait un seul appel au gestionnaire (résout les dépendances en une passe). Avec loop:, chaque paquet déclenche un appel séparé — 4× plus lent sur des paquets indépendants.

state:ComportementUsage
presentInstalle si absent — n’upgrade pasDéfaut — installation idempotente
latestInstalle et upgrade vers la dernière versionMise à jour systématique
absentSupprime si présentNettoyage de paquets obsolètes

Attention à state: latest : sur un parc en production, c’est une mise à jour non maîtrisée au moindre run. Préférer state: present + un play de patch dédié (cf. dnf: security: true).

- name: Supprimer telnet (en clair)
ansible.builtin.package:
name: telnet
state: absent

state: absent est idempotent — si déjà absent, tâche ok. Utile pour les durcissements de poste (CIS Benchmark) : forcer l’absence de paquets dangereux comme telnet, rsh, xinetd.

Par défaut, Ansible auto-détecte (use: auto). Vous pouvez forcer :

- name: Forcer dnf meme si Ansible detecte autre chose
ansible.builtin.package:
name: htop
state: present
use: dnf

Cas réel : machine RHEL avec apt installé (rare, mais arrive sur des images Docker bizarres). use: dnf garantit que c’est dnf qui exécute.

package: n’expose que les options communes à tous les gestionnaires. Pour utiliser :

  • enablerepo: / disablerepo: — passer à dnf:.
  • Mises à jour de sécurité uniquement (security: true) — dnf: uniquement.
  • update_cache: (refresh apt/dnf cache) — dnf: ou apt: directement.
  • Modules de groupe (@web-server sur RHEL) — dnf: avec name: '@web-server'.

package: consulte la base de données du gestionnaire pour savoir si le paquet est installé. Sur 100 hôtes, vérifier 10 paquets = 1000 requêtes DB locales. C’est rapide mais pas instantané.

Pour des plays courants (smoke test post-déploiement), grouper les paquets dans une seule tâche name: [...] comme montré plus haut — division par N du temps total.

SymptômeCauseFix
Could not find a match sur RHELRepo manquant ou désactivéActiver le repo : passer à dnf: enablerepo:
state: latest upgrade un paquet critique en prodMise à jour non maîtriséePréférer present + cycle de patching dédié
Boucle loop: lente sur 50 paquetsUn appel au gestionnaire par paquetUtiliser name: [<liste>] à la place
package: name: vim sur RHEL ne donne pas vimvim-enhanced est le paquet réel sur RHELVérifier le nom exact selon la distro
  • package: = multi-distro, dnf:/apt: = mono-distro avec options spécifiques.
  • Liste de paquets dans name: [...] plutôt que boucle — 4× plus rapide.
  • state: latest est dangereux sur des paquets critiques en prod — préférer present + cycle de patching.
  • state: absent est l’outil de durcissement (CIS Benchmark) — supprimer telnet, rsh, etc.

Cette page a un lab d’accompagnement : labs/modules-paquets/package/ dans stephrobert/ansible-training.

Challenge — sur web1.lab :

  1. Installer vim-enhanced, bash-completion, tree en une seule tâche.
  2. S’assurer que telnet est absent.

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook solution.yml
pytest -v labs/modules-paquets/package/challenge/tests/

5 tests vérifient l’installation des paquets, l’absence de telnet et la disponibilité du binaire vim.

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