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.