Bonnes pratiques et idempotence 20 min de lecture

Tags, gestion des erreurs et organisation

Tags : executer des taches specifiques

---
- name: Configurer le serveur
  hosts: webservers
  become: yes

  tasks:
    - name: Installer les paquets
      apt:
        name:
          - nginx
          - php-fpm
        state: present
      tags:
        - install
        - packages

    - name: Deployer la configuration
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      tags:
        - config
        - nginx

    - name: Deployer l'application
      git:
        repo: https://github.com/user/app.git
        dest: /var/www/app
      tags:
        - deploy
        - app
# Executer uniquement les taches avec le tag "config"
ansible-playbook site.yml --tags config

# Executer plusieurs tags
ansible-playbook site.yml --tags "install,config"

# Exclure des tags
ansible-playbook site.yml --skip-tags deploy

# Lister les tags disponibles
ansible-playbook site.yml --list-tags

Gestion des erreurs

# Ignorer une erreur
- name: Supprimer un fichier qui n'existe peut-etre pas
  file:
    path: /tmp/optional-file.txt
    state: absent
  ignore_errors: yes

# Bloc try/rescue/always
- name: Deployer l'application avec rollback
  block:
    - name: Deployer la nouvelle version
      git:
        repo: https://github.com/user/app.git
        dest: /var/www/app
        version: "{{ new_version }}"

    - name: Redemarrer l'application
      service:
        name: myapp
        state: restarted

  rescue:
    - name: Revenir a la version precedente
      git:
        repo: https://github.com/user/app.git
        dest: /var/www/app
        version: "{{ old_version }}"

    - name: Redemarrer avec l'ancienne version
      service:
        name: myapp
        state: restarted

  always:
    - name: Envoyer une notification
      debug:
        msg: "Deploiement termine (succes ou rollback)"

Bonnes pratiques de nommage et organisation

# 1. Toujours nommer les taches
- name: Installer Nginx            # BON
- apt: name=nginx state=present    # MAUVAIS (pas de name)

# 2. Utiliser le format YAML complet
# BON
- name: Installer Nginx
  apt:
    name: nginx
    state: present

# MAUVAIS (format inline)
- apt: name=nginx state=present

# 3. Structure de projet recommandee
project/
  ansible.cfg
  inventory/
  group_vars/
  host_vars/
  roles/
  playbooks/
  files/
  templates/

# 4. Un playbook par fonction
playbooks/
  site.yml            # Playbook principal
  webservers.yml      # Specifique aux serveurs web
  dbservers.yml       # Specifique aux BDD
  monitoring.yml      # Specifique au monitoring

Resume des bonnes pratiques

  • Utilisez des modules specifiques plutot que shell/command
  • Nommez toujours vos taches de facon descriptive
  • Testez avec --check --diff avant d'appliquer
  • Utilisez des tags pour organiser et cibler l'execution
  • Separez les secrets dans des fichiers chiffres avec Vault
  • Organisez votre code en roles reutilisables
  • Versionnez votre code Ansible dans Git
  • Utilisez des blocs block/rescue/always pour la gestion d'erreurs
Conseil final : Lancez toujours ansible-playbook --check --diff en premier sur un environnement de staging avant la production.