Contactez-nous

Exemple 3 : Installer un paquet avec le module `apt` ou `yum`/`dnf`

Apprenez à gérer les paquets logiciels sur vos serveurs Linux avec les modules Ansible `apt` (Debian/Ubuntu) et `yum`/`dnf` (RHEL/CentOS/Fedora) via des commandes Ad-Hoc.

Gestion de paquets : une tâche centrale de l'administration système

L'installation, la mise à jour et la suppression de paquets logiciels sont des opérations courantes et essentielles en administration système. Ansible excelle dans l'automatisation de ces tâches grâce à des modules dédiés pour les principaux gestionnaires de paquets des distributions Linux. Plutôt que d'utiliser les modules génériques command ou shell pour appeler apt-get install ou yum install, il est fortement recommandé d'utiliser les modules spécifiques comme apt, yum, ou dnf.

L'avantage principal de ces modules spécialisés est leur idempotence. Ils vérifient l'état actuel du paquet sur le système cible avant d'entreprendre une action. Par exemple, si vous demandez d'installer un paquet qui est déjà présent dans la version souhaitée, le module ne fera rien et rapportera que l'état est déjà conforme. Cela rend vos automatisations plus sûres, plus prévisibles et plus efficaces, car elles ne réexécutent pas inutilement des opérations déjà effectuées.

De plus, ces modules offrent une interface structurée avec des paramètres clairs (nom du paquet, état désiré, version, etc.), ce qui améliore la lisibilité et la maintenabilité de vos commandes Ad-Hoc et de vos playbooks.

Le module `apt` pour les systèmes Debian/Ubuntu

Sur les systèmes d'exploitation basés sur Debian, tels qu'Ubuntu, le gestionnaire de paquets principal est APT (Advanced Package Tool). Ansible fournit le module apt pour interagir avec celui-ci. Ce module permet d'installer, mettre à jour, supprimer des paquets, mettre à jour le cache des paquets, et effectuer des mises à niveau du système.

Les paramètres les plus courants du module apt sont :

  • name (ou alias pkg) : Le nom du paquet ou une liste de noms de paquets à gérer.
  • state : L'état désiré du paquet. Valeurs courantes :
    • present (défaut) : S'assure que le paquet est installé. Si une version spécifique est demandée (name=nginx=1.18.0), s'assure que cette version est installée.
    • latest : S'assure que la dernière version disponible du paquet est installée.
    • absent : S'assure que le paquet est désinstallé.
    • build-dep : Installe les dépendances de compilation pour un paquet source.
  • update_cache : Un booléen (yes/no). Si yes, exécute apt-get update avant d'installer/mettre à jour le paquet. C'est souvent nécessaire pour s'assurer que la liste des paquets disponibles est à jour.
  • force_apt_get : Booléen. Utilise apt-get au lieu de aptitude si les deux sont installés.
  • autoremove : Booléen (yes/no). Utilisé avec state=absent, supprime également les dépendances qui ne sont plus nécessaires.
  • purge : Booléen (yes/no). Utilisé avec state=absent, supprime également les fichiers de configuration du paquet.

Exemple : Installer le paquet htop sur un serveur Ubuntu.
Cette opération nécessite des privilèges root, donc l'option -b (--become) est utilisée pour la montée en privilèges (typiquement via sudo).

ansible mon_serveur_ubuntu -m apt -a "name=htop state=present update_cache=yes" -b

Si htop n'est pas installé, Ansible l'installera après avoir mis à jour le cache. Si htop est déjà installé, Ansible ne fera rien et le signalera.

Exemple : S'assurer que nginx est à la dernière version :

ansible webservers_ubuntu -m apt -a "name=nginx state=latest" -b

Exemple : Désinstaller le paquet apache2 et ses dépendances inutiles :

ansible serveur_a_nettoyer -m apt -a "name=apache2 state=absent autoremove=yes" -b

Les modules `yum` et `dnf` pour les systèmes RHEL/CentOS/Fedora

Pour les distributions basées sur Red Hat Enterprise Linux (RHEL), comme CentOS et Fedora, les gestionnaires de paquets traditionnels sont YUM (Yellowdog Updater, Modified) et plus récemment DNF (Dandified YUM). Ansible fournit les modules yum et dnf respectivement.

Les paramètres de ces modules sont très similaires à ceux du module apt, avec quelques spécificités :

  • name (ou alias pkg) : Le nom du paquet, une liste de noms, ou un glob (ex: kernel-*). Peut aussi être un chemin vers un fichier .rpm local ou une URL.
  • state : L'état désiré (present, latest, absent).
  • update_cache : (Pour yum) Booléen. Exécute yum clean expire-cache avant l'action. Pour dnf, le cache est généralement géré plus automatiquement, mais l'option existe.
  • enablerepo / disablerepo : Permet d'activer ou de désactiver temporairement des dépôts spécifiques pour cette transaction.
  • autoremove : (Pour yum et dnf avec state=absent) Booléen. Supprime les dépendances inutiles.
  • list : (Pour yum et dnf) Un argument spécial pour lister les paquets. Par exemple, list=installed, list=available, list=nginx.

Exemple : Installer le paquet epel-release sur un serveur CentOS 7 (module yum) :
epel-release est un paquet qui configure le dépôt EPEL (Extra Packages for Enterprise Linux).

ansible mon_serveur_centos7 -m yum -a "name=epel-release state=present" -b

Exemple : Installer tmux sur un serveur Fedora (module dnf) :

ansible mon_serveur_fedora -m dnf -a "name=tmux state=present" -b

Exemple : Mettre à jour tous les paquets sur un serveur RHEL 8 (équivalent de dnf update -y) :
Utiliser name=* et state=latest.

ansible mon_serveur_rhel8 -m dnf -a "name=* state=latest" -b

Exemple : Vérifier si le paquet httpd est installé sur des serveurs CentOS (module yum) :
Ce n'est pas une installation, mais une interrogation. La tâche sera marquée comme "ok" si le paquet est installé, et "failed" sinon (comportement par défaut pour une simple vérification de présence sans state=present). Une meilleure approche pour vérifier est d'utiliser list=httpd.

# Pour juste vérifier (moins idiomatique, mais possible)
ansible centos_servers -m yum -a "name=httpd" -b

# Meilleure approche pour lister/vérifier
ansible centos_servers -m yum -a "list=httpd" -b

La sortie de list=httpd vous donnera des informations détaillées sur le paquet s'il est installé ou disponible.

Utilisation du module générique `package`

Ansible propose également un module générique nommé package. Ce module tente de détecter automatiquement le gestionnaire de paquets approprié pour le système d'exploitation du noeud géré (apt, yum, dnf, zypper, etc.) et relaie ensuite l'action à ce gestionnaire.

Les paramètres de base comme name et state (present, latest, absent) sont communs.

Exemple : S'assurer que le paquet curl est installé sur tous les serveurs, quelle que soit leur distribution (compatible) :

ansible all -m package -a "name=curl state=present" -b

Bien que le module package soit pratique pour des playbooks ou des commandes Ad-Hoc devant fonctionner sur des parcs hétérogènes, il a quelques limitations :

  • Il ne supporte que les fonctionnalités communes à tous les gestionnaires de paquets sous-jacents. Les options spécifiques à apt (comme purge) ou à yum (comme enablerepo) ne seront pas disponibles directement via le module package.
  • La détection peut parfois échouer ou ne pas être optimale pour des systèmes très spécifiques ou personnalisés.

En général, si vous connaissez la famille de distribution de vos cibles, il est souvent préférable d'utiliser le module spécifique (apt, yum, dnf) car il vous donne accès à l'ensemble des fonctionnalités du gestionnaire de paquets et un contrôle plus fin.

L'utilisation de ces modules de gestion de paquets via des commandes Ad-Hoc est un excellent moyen d'effectuer des installations ou des mises à jour rapides sur un ensemble de machines. Pour des scénarios plus complexes impliquant la configuration de dépôts, la gestion de priorités de paquets, ou des séquences d'installation/configuration, les playbooks Ansible offriront une structure plus robuste et maintenable.