
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).
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Quand utiliser
package:(multi-distro) vsdnf:/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: latestsur des paquets critiques (mises à jour non maîtrisées).
Prérequis
Section intitulée « Prérequis »- Avoir un managed node avec
become: trueconfiguré. - Connaître la syntaxe d’un play (cf. Plays et tasks).
Installation simple
Section intitulée « Installation simple »- name: Installer vim-enhanced ansible.builtin.package: name: vim-enhanced state: presentstate: 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: presentBien 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.
Les 3 valeurs de state:
Section intitulée « Les 3 valeurs de state: »state: | Comportement | Usage |
|---|---|---|
present | Installe si absent — n’upgrade pas | Défaut — installation idempotente |
latest | Installe et upgrade vers la dernière version | Mise à jour systématique |
absent | Supprime si présent | Nettoyage 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).
Désinstallation
Section intitulée « Désinstallation »- name: Supprimer telnet (en clair) ansible.builtin.package: name: telnet state: absentstate: 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.
Forcer le module sous-jacent — use:
Section intitulée « Forcer le module sous-jacent — use: »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: dnfCas 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.
Quand package: ne suffit plus
Section intitulée « Quand package: ne suffit plus »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:ouapt:directement.- Modules de groupe (
@web-serversur RHEL) —dnf:avecname: '@web-server'.
Idempotence et performance
Section intitulée « Idempotence et performance »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.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
Could not find a match sur RHEL | Repo manquant ou désactivé | Activer le repo : passer à dnf: enablerepo: |
state: latest upgrade un paquet critique en prod | Mise à jour non maîtrisée | Préférer present + cycle de patching dédié |
Boucle loop: lente sur 50 paquets | Un appel au gestionnaire par paquet | Utiliser name: [<liste>] à la place |
package: name: vim sur RHEL ne donne pas vim | vim-enhanced est le paquet réel sur RHEL | Vérifier le nom exact selon la distro |
À retenir
Section intitulée « À retenir »package:= multi-distro,dnf:/apt:= mono-distro avec options spécifiques.- Liste de paquets dans
name: [...]plutôt que boucle — 4× plus rapide. state: latestest dangereux sur des paquets critiques en prod — préférerpresent+ cycle de patching.state: absentest l’outil de durcissement (CIS Benchmark) — supprimer telnet, rsh, etc.
Pratiquer dans le lab
Section intitulée « Pratiquer dans le lab »Cette page a un lab d’accompagnement : labs/modules-paquets/package/ dans stephrobert/ansible-training.
Challenge — sur web1.lab :
- Installer
vim-enhanced,bash-completion,treeen une seule tâche. - S’assurer que
telnetest absent.
Validation pytest+testinfra :
ansible-playbook solution.ymlpytest -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.