Aller au contenu
Infrastructure as Code medium

argument_specs.yml : validation automatique des variables d'un rôle Ansible

10 min de lecture

Logo Ansible

meta/argument_specs.yml est le contrat d’API d’un rôle Ansible. Il déclare le type, les choix possibles, la valeur par défaut, et la description de chaque variable d’entrée. Au runtime, Ansible valide automatiquement les valeurs passées au rôle — erreur claire si l’utilisateur fournit une string là où on attend un int, ou une valeur hors d’une liste de choix.

Disponible depuis Ansible 2.11, argument_specs.yml est devenu standard de fait en 2026 — ansible-lint --profile=production l’attend et ansible-doc --type role l’utilise pour générer la documentation. C’est l’une des meilleures pratiques 2026 à adopter dès vos premiers rôles.

  • Écrire meta/argument_specs.yml complet pour le rôle webserver.
  • Valider les types (str, int, bool, list, dict).
  • Imposer une liste de choix (choices: [...]).
  • Marquer des variables comme required: true.
  • Tester la validation : passage d’une valeur invalide → échec immédiat.
  • Générer la documentation auto via ansible-doc --type role.
meta/argument_specs.yml
---
argument_specs:
main: # ← entrypoint principal du rôle (tasks/main.yml)
short_description: "Installer et configurer nginx avec validation"
description:
- >
Ce rôle installe nginx, le configure via un template, et ouvre le port
HTTP. Toutes les variables d'entrée sont validées automatiquement
avant l'exécution des tâches.
author:
- Stéphane Robert
options:
webserver_package:
type: str
default: nginx
description: Nom du paquet à installer
choices:
- nginx
webserver_state:
type: str
default: present
description: État du paquet
choices:
- present
- absent
- latest
webserver_listen_port:
type: int
default: 80
description: Port d'écoute HTTP (1-65535)
webserver_worker_processes:
type: str
default: auto
description: |
Nombre de worker_processes nginx. 'auto' = un par cœur CPU.
Sinon une chaîne représentant un entier.
webserver_worker_connections:
type: int
default: 1024
description: "Connexions max par worker (typique : 1024-8192)"
webserver_index_content:
type: str
required: false
description: Contenu HTML de la page d'accueil

Le rôle peut exposer plusieurs entrypoints (tasks/main.yml, tasks/configure.yml, tasks/secure.yml). Chaque entrypoint a sa propre section dans argument_specs:. Le plus courant : main: qui valide les variables de tasks/main.yml.

Documentation lisible. Affichée dans ansible-doc --type role <role>. Obligatoire pour la qualité.

options:
webserver_listen_port:
type: int # ← type Python attendu
default: 80 # ← valeur par défaut si absente
description: "Port HTTP" # ← documentation
required: false # ← obligatoire ou non
choices: [80, 8080, 8443] # ← liste de valeurs autorisées

Types supportés : str, int, float, bool, list, dict, path, raw.

Fenêtre de terminal
ansible-playbook playbook.yml -e "webserver_listen_port=8080"

Sortie : la tâche Validating arguments against arg spec 'main' apparaît, ok. Le play continue.

Fenêtre de terminal
ansible-playbook playbook.yml -e "webserver_state=installed"

Sortie :

TASK [stephrobert.webserver : Validating arguments against arg spec 'main'] ***
fatal: [web1.lab]: FAILED! => {
"argument_errors": [
"value of webserver_state must be one of: present, absent, latest, got: installed"
],
"msg": "Validation of arguments failed:..."
}

Erreur claire : Ansible refuse d’exécuter le rôle. Aucune tâche n’a tourné — pas de demi-déploiement.

Fenêtre de terminal
ansible-playbook playbook.yml -e "webserver_listen_port=cinquante"

Sortie :

"argument_errors": [
"argument 'webserver_listen_port' is of type <class 'str'> and we were unable to convert to int"
]

argument_specs.yml supporte les dicts imbriqués et listes de dicts. Exemple pour un rôle users :

options:
users_to_create:
type: list
elements: dict
required: false
default: []
description: Liste des utilisateurs à créer
options:
name:
type: str
required: true
description: Nom de l'utilisateur
shell:
type: str
required: false
choices:
- /bin/bash
- /bin/zsh
- /sbin/nologin
groups:
type: list
elements: str
required: false
default: []

L’utilisateur peut passer :

users_to_create:
- name: alice
shell: /bin/zsh
groups: [wheel, developers]
- name: bob
shell: /bin/bash

Et Ansible valide que chaque entrée a le bon format. Une shell: /bin/csh ferait échouer la validation (pas dans choices:).

Une fois argument_specs.yml posé, le rôle est documenté automatiquement :

Fenêtre de terminal
ansible-doc --type role stephrobert.webserver

Sortie :

> STEPHROBERT.WEBSERVER
ENTRY POINT: main - Installer et configurer nginx avec validation
OPTIONS (= is mandatory):
= webserver_package
Nom du paquet à installer
choices: [nginx]
default: nginx
type: str
- webserver_listen_port
Port d'écoute HTTP (1-65535)
default: 80
type: int
...

Documentation à jour à 100 % — synchro avec le code, pas de drift entre code et README.

Cette page a un lab d’accompagnement : labs/roles/argument-specs/ dans stephrobert/ansible-training.

Le lab ajoute meta/argument_specs.yml au rôle webserver et prouve la validation par 5 tests testinfra dont un qui lance le playbook avec une valeur invalide et vérifie que l’échec contient le message attendu.

Fenêtre de terminal
cd ~/Projets/ansible-training/labs/roles/argument-specs/
ansible-doc --type role webserver # doc auto-générée
pytest -v challenge/tests/ # 5 tests dont validation négative
SymptômeCauseFix
argument_specs ignoréAnsible < 2.11Mettre à jour
Variable non validéePas dans options: du argument_specs.ymlAjouter chaque variable de defaults/ dans la spec
default: ignorérequired: true + default: (incompatible)Choisir : soit obligatoire, soit avec défaut
Erreur sur valeur JinjaTemplates non résolus avant validationDéfinir la variable en clair dans le play, pas via lookup
ansible-doc --type role plantePas de meta/argument_specs.ymlCréer le fichier (au moins squelette main:)
  • meta/argument_specs.yml = contrat d’API d’un rôle. Standard 2026.
  • Validation automatique : type, choix, required, valeurs imbriquées.
  • Erreur claire au runtime si valeur invalide — pas de demi-déploiement.
  • Documentation auto via ansible-doc --type role.
  • ansible-lint --profile=production vérifie la présence du fichier.
  • Supporte dicts imbriqués et listes de dicts (rôles complexes).

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn