Bonnes pratiques et idempotence 18 min de lecture

Idempotence et mode check

L'idempotence dans Ansible

L'idempotence signifie que l'execution repetee d'un playbook produit toujours le meme etat final, sans effets de bord indesirables. C'est un principe fondamental d'Ansible.

Modules idempotents vs non-idempotents

# IDEMPOTENT : apt verifie si le paquet est deja installe
- name: Installer Nginx (idempotent)
  apt:
    name: nginx
    state: present
  # Premiere execution : changed
  # Executions suivantes : ok (pas de changement)

# NON-IDEMPOTENT : shell/command s'execute a chaque fois
- name: Creer un fichier (NON idempotent)
  shell: echo "hello" > /tmp/test.txt
  # S'execute a chaque fois, meme si le fichier existe deja

# SOLUTION idempotente : utiliser le module copy
- name: Creer un fichier (idempotent)
  copy:
    content: "hello"
    dest: /tmp/test.txt
  # Ne modifie le fichier que si le contenu est different

Rendre les commandes shell idempotentes

# Utiliser creates / removes pour la garde
- name: Initialiser la base de donnees
  shell: /opt/app/init-db.sh
  args:
    creates: /opt/app/.db_initialized
  # Ne s'execute que si le fichier n'existe PAS

- name: Supprimer les logs anciens
  shell: find /var/log/app -name "*.log" -mtime +30 -delete
  args:
    removes: /var/log/app
  # Ne s'execute que si le repertoire EXISTE

Mode check (dry run)

# Executer en mode check (aucun changement applique)
ansible-playbook site.yml --check

# Afficher les differences (diff) en mode check
ansible-playbook site.yml --check --diff

# Certaines taches peuvent echouer en mode check
# Utilisez check_mode pour les ignorer
- name: Installer un paquet
  apt:
    name: nginx
    state: present

- name: Verifier la version installee
  command: nginx -v
  register: nginx_version
  check_mode: no    # S'execute meme en mode check
  changed_when: false

changed_when et failed_when

# Controler quand une tache est consideree "changed"
- name: Verifier la configuration Nginx
  command: nginx -t
  register: nginx_test
  changed_when: false    # Cette commande ne change rien

# Controler quand une tache est consideree "failed"
- name: Verifier si l'application repond
  uri:
    url: "http://localhost:{{ app_port }}/health"
    status_code: 200
  register: health_check
  failed_when: health_check.status != 200
  retries: 5
  delay: 3
Regle d'or : Preferez toujours un module Ansible specifique (apt, copy, file) au module shell/command. Les modules sont idempotents par conception.