Ansible propose plusieurs emplacements pour définir une variable, avec un ordre de précédence — utile pour comprendre pourquoi une valeur écrase une autre.


defaults vs vars

# roles/health-agent/defaults/main.yml — faible précédence, pensé pour être surchargé
health_agent_port: 8080
health_agent_path: /healthz
health_agent_timeout_seconds: 3
health_agent_command:
  - runuser
  - -u
  - postgres
  - --
  - psql
  - --dbname=postgres
  - --no-psqlrc
  - --quiet
  - --command=SELECT 1;
EmplacementPrécédenceUsage
roles/*/defaults/main.ymlLa plus faibleValeurs par défaut d’un role, destinées à être surchargées par l’appelant
roles/*/vars/main.ymlPlus forte que defaultsConstantes internes au role, pas censées être modifiées de l’extérieur
Variables du playbook (vars:)Plus forte encoreSpécifique à un play
-e / --extra-vars en CLILa plus forteSurcharge tout le reste

Dans le projet, health_agent_port vit dans defaults/ précisément pour rester facile à surcharger si un autre déploiement veut un port différent, sans toucher au role.


Utiliser une variable

- name: Déployer la configuration du health agent
  ansible.builtin.template:
    src: config.json.j2
    dest: /etc/health-agent/config.json
{
  "port": {{ health_agent_port }}
}

Syntaxe {{ variable }} — voir Jinja2 dans Ansible pour le détail du moteur de template.


Handlers — réagir à un changement

tasks:
  - name: Déployer la configuration
    ansible.builtin.template:
      src: config.json.j2
      dest: /etc/health-agent/config.json
    notify: Redémarrer le health agent
 
handlers:
  - name: Redémarrer le health agent
    ansible.builtin.systemd_service:
      name: health-agent
      state: restarted

Un handler ne s’exécute que si une task qui le notify a effectivement changé quelque chose (changed), et seulement une fois à la fin du play même si plusieurs tasks le notifient. C’est le mécanisme standard pour « redémarrer le service si sa config a changé, sinon ne rien faire ».


En relation avec