Strategies de deploiement 28 min de lecture

Rolling updates et strategies de mise a jour

Rolling Update avec Ansible

Le rolling update met a jour les serveurs par lots pour eviter les interruptions de service.

Configuration serial

- hosts: web_servers
  serial: 2              # 2 serveurs a la fois
  max_fail_percentage: 25 # Arreter si plus de 25% echouent

  pre_tasks:
    - name: Retirer du load balancer
      ansible.builtin.uri:
        url: "http://{{ lb_host }}/api/pool/{{ inventory_hostname }}"
        method: DELETE
      delegate_to: localhost

  tasks:
    - name: Arreter l'application
      ansible.builtin.systemd:
        name: mon-app
        state: stopped

    - name: Deployer la nouvelle version
      ansible.builtin.copy:
        src: "app-{{ app_version }}.tar.gz"
        dest: /opt/mon-app/
      notify: restart_app

    - name: Extraire l'archive
      ansible.builtin.unarchive:
        src: "/opt/mon-app/app-{{ app_version }}.tar.gz"
        dest: /opt/mon-app/
        remote_src: true

  post_tasks:
    - name: Attendre que l'application soit prete
      ansible.builtin.uri:
        url: "http://{{ inventory_hostname }}:8080/health"
        status_code: 200
      retries: 30
      delay: 5
      register: health_check
      until: health_check.status == 200

    - name: Reajouter au load balancer
      ansible.builtin.uri:
        url: "http://{{ lb_host }}/api/pool"
        method: POST
        body_format: json
        body:
          host: "{{ inventory_hostname }}"
      delegate_to: localhost

  handlers:
    - name: restart_app
      ansible.builtin.systemd:
        name: mon-app
        state: restarted

Serial progressif

Augmenter progressivement le nombre de serveurs mis a jour :

- hosts: web_servers
  serial:
    - 1          # Premier serveur seul (canary)
    - 5          # Puis 5 serveurs
    - "25%"      # Puis 25% du reste

  tasks:
    - name: Deployer l'application
      include_role:
        name: deploy_app

Canary Deployment

Le deploiement canary envoie d'abord sur un petit sous-ensemble pour valider :

- hosts: canary_servers
  tasks:
    - name: Deployer sur les canaries
      include_role:
        name: deploy_app
      vars:
        app_version: "{{ new_version }}"

    - name: Executer les tests smoke
      ansible.builtin.uri:
        url: "http://{{ inventory_hostname }}:8080/health"
        status_code: 200
      retries: 10
      delay: 3
      register: smoke_test
      until: smoke_test.status == 200

    - name: Valider les metriques
      ansible.builtin.uri:
        url: "http://prometheus:9090/api/v1/query"
        body_format: json
        body:
          query: 'rate(http_errors_total{instance="{{ inventory_hostname }}"}[5m])'
      register: error_rate
      failed_when: error_rate.json.data.result[0].value[1] | float > 0.01

- hosts: production_servers
  serial: "25%"
  tasks:
    - name: Deployer sur la production
      include_role:
        name: deploy_app
      vars:
        app_version: "{{ new_version }}"
Regle : Toujours tester sur un canary avant un deploiement complet en production.