Aller au contenu
Infrastructure as Code medium

Module Ansible yum_repository : déclarer un dépôt RPM RHEL/AlmaLinux

10 min de lecture

Logo Ansible

Le module ansible.builtin.yum_repository déclare un dépôt RPM (yum/dnf) en générant le fichier .repo correspondant dans /etc/yum.repos.d/. C'est l'outil pour activer EPEL, ajouter le dépôt Docker CE, déclarer un dépôt interne d'entreprise, ou désactiver un dépôt par défaut. Public visé : intermédiaires Ansible sur RHEL/AlmaLinux/Rocky/Fedora. Cette page couvre la déclaration complète (URL, GPG, priority, exclude), l'import de la clé GPG via ansible.builtin.rpm_key, les patterns sécurité (gpgcheck=1 mandatory) et les différences avec dnf (qui installe des paquets, pas des dépôts).

  • Déclarer un dépôt RPM avec son URL et son baseurl.
  • Importer la clé GPG du dépôt avant son activation (sécurité).
  • Gérer un dépôt désactivé (présent mais enabled: 0) pour usage ponctuel.
  • Comprendre la différence entre yum_repository (déclare un dépôt) et dnf (installe des paquets).
  • Suivre les bonnes pratiques sécurité : gpgcheck mandatory, signature de la metadata.
  • Ansible installé et nœud cible Linux RPM-based (RHEL 8/9/10, AlmaLinux, Rocky, CentOS Stream, Fedora).
  • Connaissances de base sur les fichiers .repo (cf. man yum.conf ou man dnf.conf).
  • Privilèges root sur le nœud (become: true).
- name: Importer la clé GPG EPEL 9
ansible.builtin.rpm_key:
state: present
key: https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-9
- name: Déclarer le dépôt EPEL 9
ansible.builtin.yum_repository:
name: epel
description: "Extra Packages for Enterprise Linux 9"
baseurl: "https://dl.fedoraproject.org/pub/epel/9/Everything/$basearch/"
gpgcheck: true
gpgkey: https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-9
enabled: true
state: present

Comportement :

  • Crée /etc/yum.repos.d/epel.repo (nom dérivé du name).
  • Si le fichier existe déjà avec les mêmes valeurstask ok (idempotent).
  • Si une valeur diffère → fichier réécrit et task changed.

Deux étapes obligatoires :

  1. Importer la clé GPG en premier avec rpm_key. Sans la clé, le 1er dnf install depuis ce dépôt échouera avec GPG check failed.
  2. Déclarer le dépôt ensuite avec gpgcheck: true et gpgkey: pointant vers la même clé.
- ansible.builtin.yum_repository:
name: docker-ce # nom interne (= nom du fichier .repo)
description: "Docker CE Stable - $basearch"
baseurl: "https://download.docker.com/linux/centos/$releasever/$basearch/stable"
gpgcheck: true # mandatory en prod
gpgkey: https://download.docker.com/linux/centos/gpg
enabled: true # 1=actif, 0=déclaré mais inactif
state: present # present|absent
file: docker-ce # nom du fichier sans .repo (défaut = name)
priority: 50 # plugin yum-plugin-priorities
exclude: "docker-ce-1.13*" # exclure des paquets de ce dépôt
includepkgs: "docker-ce*" # inclure UNIQUEMENT ces paquets
sslverify: true # vérifier le cert HTTPS du repo
metadata_expire: 86400 # cache metadata en secondes

Les variables $releasever, $basearch, $arch sont des macros yum/dnf résolues à l'exécution :

  • $releasever : version majeure de l'OS (9 sur RHEL 9, 10 sur RHEL 10).
  • $basearch : architecture du système (x86_64, aarch64).
  • $arch : architecture précise (rare en pratique).

Ne pas remplacer ces macros par des valeurs en dur, sinon le rôle ne marche que sur une seule architecture/version.

Cas typique : votre rôle doit désactiver un dépôt par défaut (sans le supprimer) pour forcer les installations vers un mirror interne.

- name: Désactiver le dépôt RHEL appstream sans le supprimer
ansible.builtin.yum_repository:
name: rhel-9-for-x86_64-appstream-rpms
file: redhat # le fichier .repo où le dépôt est défini
description: "RHEL 9 AppStream (désactivé par stratégie interne)"
enabled: false
state: present

state: present + enabled: false = le dépôt reste déclaré dans le fichier .repo mais n'est pas utilisé par dnf. C'est différent de state: absent qui supprime la section du fichier.

C'est une confusion fréquente. Mémoriser :

ModuleRôle
ansible.builtin.yum_repositoryDéclare/configure un dépôt (fichier .repo)
ansible.builtin.rpm_keyImporte une clé GPG dans le keyring rpm
ansible.builtin.dnfInstalle/désinstalle des paquets depuis les dépôts actifs
ansible.builtin.packageWrapper portable (dnf, apt, pacman…)

Une chaîne typique pour ajouter un dépôt + installer un paquet :

- name: 1. Importer la clé GPG
ansible.builtin.rpm_key:
state: present
key: https://download.docker.com/linux/centos/gpg
- name: 2. Déclarer le dépôt
ansible.builtin.yum_repository:
name: docker-ce
description: "Docker CE Stable"
baseurl: "https://download.docker.com/linux/centos/$releasever/$basearch/stable"
gpgcheck: true
gpgkey: https://download.docker.com/linux/centos/gpg
- name: 3. Installer le paquet
ansible.builtin.dnf:
name: docker-ce
state: present

L'ordre est important, la clé doit exister AVANT l'installation, sinon dnf refuse.

Pilier Security du WAF. Tout dépôt déclaré sans gpgcheck est une porte ouverte à un attaquant qui contrôlerait le mirror. Il pourrait servir un paquet bash modifié et obtenir l'exécution de code root au prochain dnf update.

# ❌ JAMAIS en prod
- ansible.builtin.yum_repository:
name: insecure-repo
baseurl: "https://repo.example.com/"
gpgcheck: false # ← faille
# ✓ Toujours
- ansible.builtin.yum_repository:
name: secure-repo
baseurl: "https://repo.example.com/"
gpgcheck: true
gpgkey: https://repo.example.com/RPM-GPG-KEY

Encore mieux : ajouter repo_gpgcheck: true qui force la vérification de la signature de la metadata du dépôt (en plus des paquets) :

- ansible.builtin.yum_repository:
name: secure-repo
baseurl: "https://repo.example.com/"
gpgcheck: true
repo_gpgcheck: true # vérifie aussi la signature de repomd.xml
gpgkey: https://repo.example.com/RPM-GPG-KEY

Tous les dépôts modernes (EPEL 9+, Docker CE) supportent repo_gpgcheck.

Pour les dépôts qui supportent plusieurs miroirs :

- ansible.builtin.yum_repository:
name: epel
description: "EPEL via mirror"
mirrorlist: "https://mirrors.fedoraproject.org/metalink?repo=epel-9&arch=$basearch"
# PAS de baseurl ici — mirrorlist gère le choix
gpgcheck: true
gpgkey: https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-9

mirrorlist ou metalink retourne dynamiquement la liste des miroirs disponibles, dnf choisit le plus proche. Avantage : résilience si un miroir tombe. Inconvénient : moins déterministe en environnement air-gapped.

Pour un environnement isolé ou prod stable : préférer baseurl pointant vers votre mirror interne.

SymptômeCauseSolution
GPG check FAILED au 1er dnf installClé GPG pas importée avant la déclarationToujours rpm_key AVANT yum_repository
repository <name> is not configuredNom du dépôt vs nom du fichier confondusname: = identifiant interne, file: = nom du fichier .repo
Dépôt RHEL géré par subscription-manager qui revient après dnf updateModification d'un fichier RPM-managedCréer un fichier .repo à part avec file: overrides
Macros $basearch non résolues dans le rôleQuoted comme une string AnsibleToujours quoter (baseurl: "...$basearch..."), yum résout, pas Ansible
mirrorlist retourne 404URL incorrecte ou réseau bloquéTester curl <mirrorlist-url> manuellement
gpgcheck: yes ignoré si repo_gpgcheck activé sur un repo non signéMétadonnée non signée du dépôtDésactiver repo_gpgcheck ou demander la signature au mainteneur
Module Ansible introuvableVieille version Ansibleyum_repository est dans ansible.builtin depuis ansible-core 2.9
  • yum_repository déclare un dépôt, pas un paquet (utiliser dnf ou package pour ça).
  • rpm_key AVANT yum_repository, la clé GPG doit exister avant la déclaration.
  • gpgcheck: true est non négociable. repo_gpgcheck: true mieux quand supporté.
  • Variables $releasever/$basearch doivent rester dans le .repo, ne pas les remplacer en dur.
  • enabled: false + state: present = dépôt déclaré mais inactif (cas désactivation contrôlée).
  • file: distinct de name:, un fichier peut contenir plusieurs sections [repo].
  • mirrorlist OU baseurl, jamais les deux.

Cette page a un lab d'accompagnement : labs/modules-paquets/yum-repository/ dans stephrobert/ansible-training.

Challenge, sur db1.lab (AlmaLinux 10) :

  1. Importer la clé GPG EPEL via rpm_key: (URL https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-10).
  2. Déclarer le dépôt EPEL avec gpgcheck: true et enabled: true.
  3. Installer le paquet htop (présent dans EPEL, absent de la base) avec dnf:.
  4. Déclarer un dépôt local local-test avec enabled: false (présent mais inactif).

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook labs/modules-paquets/yum-repository/challenge/solution.yml
ansible-playbook labs/modules-paquets/yum-repository/challenge/solution.yml # 2e run = changed=0
pytest -v labs/modules-paquets/yum-repository/challenge/tests/

Les tests vérifient l'existence de /etc/yum.repos.d/epel.repo, le contenu (enabled=1, gpgcheck=1), l'installation de htop, et le enabled=0 pour local-test.

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