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.