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