Le module ansible.builtin.template rend un fichier Jinja2 (.j2) en remplaçant {{ expression }} par sa valeur, puis dépose le résultat sur la machine cible — contrairement à copy, qui transfère un fichier sans le modifier.
Exemple réel du projet
{# roles/health-agent/templates/config.json.j2 #}
{
"command": {{ health_agent_command | to_json }},
"path": {{ health_agent_path | to_json }},
"port": {{ health_agent_port }},
"timeout_seconds": {{ health_agent_timeout_seconds }}
}- name: Déployer la configuration du health agent
ansible.builtin.template:
src: config.json.j2
dest: /etc/health-agent/config.jsonLe résultat, avec les valeurs par défaut du role :
{
"command": ["runuser", "-u", "postgres", "--", "psql", "--dbname=postgres", "--no-psqlrc", "--quiet", "--command=SELECT 1;"],
"path": "/healthz",
"port": 8080,
"timeout_seconds": 3
}Filtres courants
| Filtre | Rôle |
|---|---|
| to_json | Sérialise une variable (liste, dict) en JSON — utilisé ici pour transformer la liste YAML health_agent_command en tableau JSON valide |
| default('valeur') | Valeur de repli si la variable n’est pas définie |
| lower / | upper | Transformation de casse |
| join(',') | Concatène une liste en chaîne |
| to_nice_yaml | Sérialise en YAML lisible |
template vs copy
template | copy | |
|---|---|---|
| Source | Fichier .j2 dans templates/ | Fichier statique dans files/ |
| Rendu | Variables Jinja2 interpolées | Contenu transféré tel quel |
| Usage typique | Fichiers de config qui dépendent de l’environnement | Binaires, scripts figés (health-agent.py) |
C’est pourquoi, dans le role health-agent, config.json passe par template (dépend de health_agent_port etc.) alors que health-agent.py passe par copy (identique quel que soit l’environnement).
En relation avec
- Templating — Vue d’ensemble — hub templating
- Variables et handlers — origine des variables interpolées ici
- Roles — emplacement conventionnel de
templates/