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.json

Le 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

FiltreRôle
| to_jsonSé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 / | upperTransformation de casse
| join(',')Concatène une liste en chaîne
| to_nice_yamlSérialise en YAML lisible

template vs copy

templatecopy
SourceFichier .j2 dans templates/Fichier statique dans files/
RenduVariables Jinja2 interpoléesContenu transféré tel quel
Usage typiqueFichiers de config qui dépendent de l’environnementBinaires, 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