Aller au contenu
Infrastructure as Code medium

Module package Ansible : installation agnostique multi-distro

45 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.

L'intérêt de package: ne se voit qu'en écrivant une tâche qui doit tourner sans connaître le gestionnaire de la machine. Ce lab vous fait installer plusieurs paquets en un seul appel, puis en retirer un avec state: absent, le geste de durcissement à retenir. Vous y arbitrez aussi entre state: present et state: latest, dont l'écart se paie en production.

  • Module yum_repository : installer depuis un dépôt maison suppose de le déclarer d'abord, clé GPG comprise.
  • Module systemd_service : installer un paquet ne démarre rien, le service se pilote séparément.
  • Multi-distribution : les patterns qui prennent le relais quand le nom du paquet change selon la distribution.

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