
requirements.yml déclare les rôles et collections dont votre projet dépend, avec leur provenance et leur version. Il joue le rôle d'un requirements.txt Python ou d'un package.json, à une différence près qui coûte cher : son contenu ne garantit pas ce qui se trouve sur le disque. Cette page explique le format, les sources acceptées, et surtout les cas où l'installation ne fait pas ce que le fichier demande.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Écrire un
requirements.ymlqui déclare rôles et collections. - Choisir la source adaptée : Galaxy, dépôt Git, archive.
- Épingler une version, et comprendre ce que chaque forme autorise.
- Reconnaître les deux situations où l'installation ignore votre fichier.
- Vérifier l'intégrité des collections par signature.
Prérequis
Section intitulée « Prérequis »- Connaître les sous-commandes d'installation, décrites dans la CLI ansible-galaxy.
- Un projet Ansible avec au moins un playbook.
La structure du fichier
Section intitulée « La structure du fichier »Le fichier accepte deux clés de premier niveau, indépendantes l'une de l'autre. Chacune décrit une famille d'objets, et rien n'oblige à utiliser les deux.
---roles: # Depuis Galaxy : le nom suffit, sous la forme namespace.role - name: geerlingguy.docker version: 7.4.4
# Depuis un dépôt Git, avec un nom local choisi - src: https://github.com/geerlingguy/ansible-role-nginx name: geerlingguy.nginx version: 3.1.0
collections: # Version exacte - name: ansible.posix version: "2.0.0"
# Intervalle borné - name: community.general version: ">=8.0.0,<10.0.0"Pour un rôle, la clé name est celle que vous emploierez dans vos playbooks. Quand la source est un dépôt Git, elle est donc essentielle : sans elle, le rôle prend le nom du dépôt et votre - role: nginx ne trouve rien.
Les sources acceptées
Section intitulée « Les sources acceptées »Quatre provenances couvrent tous les cas, du rôle communautaire au rôle interne d'entreprise.
Galaxy public est la source par défaut. Le nom au format namespace.role suffit, ansible-galaxy se charge de trouver le dépôt correspondant.
roles: - name: geerlingguy.docker version: 7.4.4Un dépôt Git public s'indique par son URL. La version accepte alors tout ce que Git comprend : un tag, un nom de branche ou une empreinte de commit.
roles: - src: https://github.com/geerlingguy/ansible-role-nginx name: geerlingguy.nginx version: 3.1.0 # tag, branche ou SHA de commitUn dépôt privé en SSH demande une précision supplémentaire. L'URL ne commençant pas par un protocole reconnaissable, le paramètre scm lève l'ambiguïté.
roles: - src: git@gitlab.corp.example.com:ansible/role-internal.git scm: git name: corp.internal_role version: v2.5.0Une archive téléchargeable convient aux rôles distribués par un serveur de fichiers interne, sans Git ni Galaxy.
roles: - src: https://files.corp.example.com/releases/role-v1.0.tar.gz name: corp.example_roleÉpingler une version
Section intitulée « Épingler une version »Le choix de la contrainte décide de ce qui se passera dans six mois, quand quelqu'un relancera l'installation sur une autre machine.
| Forme | Ce qui sera installé | Usage |
|---|---|---|
version: 7.4.4 | exactement cette version | production, environnement reproductible |
version: ">=8.0.0,<10.0.0" | la plus récente de l'intervalle | acceptable si l'auteur respecte le versionnage sémantique |
version: ">=1.2.0" | la plus récente, sans limite haute | risqué, une version majeure passera sans prévenir |
version: main | l'état actuel de la branche | développement uniquement |
absence de version | la plus récente disponible | à éviter, le résultat change dans le temps |
Un rôle installé par tag Git mérite une précaution supplémentaire : un tag se déplace, donc un même numéro peut livrer deux codes différents. C'est expliqué dans Versionner et publier, et cela justifie l'épinglage par empreinte de commit sur les chaînes sensibles.
Installer, et vérifier que c'est bien fait
Section intitulée « Installer, et vérifier que c'est bien fait »La commande lit le fichier et installe ce qu'il déclare.
# Les rôles seulementansible-galaxy role install -r requirements.yml -p ./roles/
# Les collections seulementansible-galaxy collection install -r requirements.yml -p ./collections/L'option -p place le contenu dans le projet plutôt que dans votre répertoire personnel, ce qui rend l'installation reproductible et visible en revue de code.
Quand l'installation ignore votre fichier
Section intitulée « Quand l'installation ignore votre fichier »Voici le comportement qui surprend le plus, et il diffère selon la famille.
Un rôle déjà présent n'est pas remplacé, même si vous avez changé sa version dans le fichier. Ansible le signale, puis poursuit sans rien faire :
[WARNING]: - geerlingguy.docker (7.4.4) is already installed - use --force tochange version to 7.4.3Le fichier demande 7.4.3, le disque contient toujours 7.4.4, et la commande se termine normalement. Votre déclaration et votre réalité ont divergé sans qu'aucune erreur ne le signale.
# Le seul moyen d'aligner le disque sur le fichieransible-galaxy role install -r requirements.yml -p ./roles/ --forceUne collection, elle, est bien remplacée par la version demandée, sans option supplémentaire. Cette asymétrie entre les deux familles n'a pas de justification pratique : elle s'explique par leur histoire, les collections étant arrivées bien après.
Retenez-en une règle simple : en intégration continue, repartez d'un répertoire vide, ou passez systématiquement --force. C'est le seul moyen d'obtenir sur le disque ce que le fichier déclare.
Vérifier l'intégrité des collections
Section intitulée « Vérifier l'intégrité des collections »Les collections publiées sur Galaxy peuvent être signées, et ansible-galaxy vérifie ces signatures à l'installation quand elles existent. Plusieurs options encadrent ce comportement.
# Exiger au moins deux signatures validesansible-galaxy collection install -r requirements.yml --required-valid-signature-count 2
# Utiliser un trousseau précisansible-galaxy collection install -r requirements.yml --keyring ~/.ansible/galaxy.kbx
# Comparer une collection déjà installée à ce que le serveur publieansible-galaxy collection verify community.generalUne signature peut aussi être déclarée directement dans le fichier, à côté de la collection concernée.
collections: - name: ansible.posix version: "2.0.0" signatures: - https://galaxy.ansible.com/api/v3/.../signature.ascL'option --disable-gpg-verify existe pour les environnements sans GPG, mais elle annule précisément la garantie que vous cherchiez. Un miroir interne compromis redevient alors indétectable.
Mettre en pratique
Section intitulée « Mettre en pratique »Le fichier déclare, le disque décide : c'est précisément cet écart que le lab fait constater. Vous écrivez un requirements.yml qui mêle rôles Galaxy, sources Git et collections, vous épinglez chaque version, puis vous installez dans un répertoire du projet plutôt que dans votre répertoire personnel. Les tests inspectent le disque au lieu de la sortie de la commande, exactement la précaution que cette page recommande.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Solution |
|---|---|---|
Collections absentes après un install -r réussi | La commande unique les ignore quand -p est présent | Lancer collection install -r séparément |
| La version installée n'est pas celle du fichier | Un rôle déjà présent n'est jamais remplacé | Ajouter --force, ou partir d'un répertoire vide |
the role 'nginx' was not found | Source Git sans clé name | Déclarer le nom local attendu par vos playbooks |
| Le contenu change alors que la version est figée | Le tag Git a été déplacé en amont | Épingler par empreinte de commit |
| Résultat différent d'une machine à l'autre | Aucune version déclarée | Épingler chaque entrée |
À retenir
Section intitulée « À retenir »requirements.ymldéclare, il ne garantit pas. Deux situations font diverger le fichier et le disque, sans erreur.- La commande unique
install -rignore les collections dès qu'un-pest présent, avec un simple avertissement et un code de retour nul. - Un rôle déjà installé n'est jamais remplacé sans
--force, alors qu'une collection l'est. Cette asymétrie est purement historique. - La clé
nameest obligatoire sur une source Git, sinon le rôle porte le nom du dépôt. - Épinglez une version exacte en production, et par empreinte de commit quand un tag déplaçable ne suffit pas.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Auditer un rôle existant : une version épinglée ne dit rien de la qualité du contenu épinglé.
- Versionner et publier : comprendre ce qu'un mainteneur garantit, et ne garantit pas, derrière un numéro de version.
- Execution Environments : vue d'ensemble : figer collections et dépendances dans une image, plutôt que les réinstaller à chaque exécution.