Chapitre 522 minIntermédiaire
Déployer un service : manuel, scripté ou automatisé
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- choisir entre un déploiement manuel, scripté ou automatisé ;
- choisir une stratégie de bascule adaptée au risque ;
- reprendre les données d'un ancien outil et contrôler l'import ;
- vérifier un déploiement par des tests de fumée et tenir son journal.
4 exercices corrigés1 schéma
Déployer un service, c'est l'installer et le configurer dans l'environnement de production, y reprendre les données utiles, le rendre accessible aux utilisateurs, puis vérifier qu'il fonctionne avant de l'annoncer. On peut le faire à la main en suivant une procédure, par un script rejouable, ou par un pipeline qui enchaîne tout automatiquement ; et on peut basculer tous les utilisateurs d'un coup ou progressivement. Ce chapitre compare ces façons de faire, puis traite la reprise des données, le déploiement sur les postes, les tests de fumée et le journal de mise en production.
Ce que comprend un déploiement
« Déployer » ne veut pas dire « copier le programme sur le serveur ». Un déploiement complet enchaîne six familles d'actions, et un oubli dans l'une d'elles suffit à rater l'ouverture.
| Action | Question | Prêt'Matos |
|---|---|---|
| Installer | Les composants sont-ils en place, dans la bonne version ? | Images 1.0.0 téléchargées, conteneurs créés |
| Configurer | Chaque composant a-t-il la configuration de la production ? | Fichier .env, secrets, certificat, adresse du relais, groupes de l'annuaire |
| Reprendre les données | L'historique utile est-il dans le nouvel outil ? | Catalogue du matériel, réservations à venir, prêts en cours |
| Ouvrir l'accès | Les utilisateurs peuvent-ils l'atteindre ? | Alias DNS, règle du pare-feu, lien sur l'intranet, favori sur les postes |
| Vérifier | Le service fonctionne-t-il vraiment, vu de l'utilisateur ? | Tests de fumée, contrôle de l'import, vérification par Nadia |
| Tracer | Peut-on dire après coup ce qui a été fait ? | Journal de mise en production, demande de changement mise à jour, version notée |
Trois façons de déployer
| Procédure manuelle | Script | Pipeline CI/CD | |
|---|---|---|---|
| Principe | Un technicien suit un mode opératoire écrit, étape par étape | Un script (Bash, PowerShell) ou un outil de configuration (Ansible) exécute les étapes | Une modification validée déclenche la construction, les tests et le déploiement, avec une approbation pour la production |
| Rejouable à l'identique | Non : chaque exécution dépend de la personne | Oui | Oui |
| Risque d'erreur humaine | Élevé (étape sautée, faute de frappe) | Faible | Faible |
| Traçabilité | Le journal tenu à la main | La sortie du script, à conserver | L'historique du pipeline, automatique |
| Effort de mise en place | Aucun, sauf écrire la procédure | Moyen | Plus élevé |
| Quand le choisir | Un déploiement unique, ou rare, sur un petit périmètre | Des déploiements réguliers, plusieurs serveurs, un retour arrière à automatiser | Des versions fréquentes d'une application avec des tests automatiques |
Ces trois façons ne s'opposent pas : on commence souvent par une procédure manuelle bien écrite, on en fait un script quand on la répète, puis on branche ce script sur un pipeline. Le point commun indispensable est une procédure écrite et versionnée : sans elle, personne d'autre ne peut déployer, et personne ne sait ce qui a été fait.
La procédure manuelle : le mode opératoire
Un mode opératoire (ou procédure de déploiement, runbook en anglais) décrit chaque étape avec la commande exacte et le résultat attendu. Il est écrit pour être suivi par quelqu'un qui ne l'a pas rédigé. Extrait de celui de Prêt'Matos :
| Étape | Action | Résultat attendu |
|---|---|---|
| 3.1 | Se connecter à srv-pretmatos depuis le bastion : ssh moussa@srv-pretmatos | Invite de commande de srv-pretmatos |
| 3.2 | Aller dans le dossier du service : cd /srv/pretmatos | Le dossier contient compose.yaml, Caddyfile, .env, certs/, secrets/ |
| 3.3 | Vérifier la version demandée : cat .env | VERSION=1.0.0 |
| 3.4 | Valider la configuration : sudo docker compose config --quiet && echo valide | valide |
| 3.5 | Télécharger les images : sudo docker compose pull | Les quatre images sont téléchargées, sans erreur |
| 3.6 | Démarrer : sudo docker compose up -d | Quatre conteneurs créés |
| 3.7 | Attendre l'état sain : sudo docker compose ps | bdd en healthy, les autres en running |
Les règles d'un bon mode opératoire : une action par ligne, la commande exacte à copier, le résultat attendu pour savoir si l'on peut continuer, et ce qu'il faut faire si ce n'est pas le cas (« si bdd n'est pas healthy après 2 minutes : lire docker compose logs bdd, puis appliquer le plan de retour arrière »). Les détails du fichier compose.yaml et du reverse proxy sont dans le cours Docker.
Le déploiement scripté
Un script transforme le mode opératoire en programme. Il n'oublie pas d'étape, ne fait pas de faute de frappe et peut être relu et testé en recette avant de servir en production. Un bon script de déploiement respecte six principes :
- Il s'arrête à la première erreur (
set -euo pipefailen Bash,$ErrorActionPreference = 'Stop'en PowerShell) au lieu de continuer sur un état cassé. - Il reçoit la version à déployer en paramètre, et la vérifie : on ne déploie jamais « la dernière », mais une version précise, celle qui a été recettée.
- Il est idempotent autant que possible : le relancer ne casse rien et ne crée pas de doublon. C'est la philosophie d'Ansible, qui décrit l'état voulu plutôt que les commandes à taper (l'idempotence).
- Il vérifie le résultat à la fin (une route de santé, un test de fumée) et renvoie un code d'erreur si le service ne répond pas.
- Il sait revenir en arrière : il mémorise la version précédente et sait la redémarrer.
- Il ne contient aucun secret : les mots de passe sont dans des fichiers de secrets ou un coffre, hors du dépôt.
Le cours Intégration continue écrit un tel script, ligne par ligne, pour une application en conteneurs. Côté SISR, le même raisonnement s'applique à un script PowerShell qui crée les groupes et le partage d'un nouveau service, ou à Ansible pour configurer dix serveurs à l'identique (automatisation avec Ansible).
Le déploiement continu
Le déploiement continu (la partie CD de CI/CD) automatise toute la chaîne : à chaque modification validée, le pipeline construit l'application, lance les tests, publie l'image, la déploie en recette, puis en production après une approbation humaine. Les étapes de ce chapitre ne disparaissent pas : elles sont écrites dans le pipeline au lieu d'être faites à la main.
| Étape du pipeline | Correspond à |
|---|---|
| Construire et tester | Tests unitaires et d'intégration (chapitre 4) |
| Publier l'image avec un numéro de version | La version figée de la recette |
| Déployer en recette | L'environnement de recette (chapitre 3) |
| Attendre l'approbation | La décision go/no-go et la demande de changement |
| Déployer en production, vérifier | Le script, les tests de fumée |
| Revenir à la version précédente si la vérification échoue | Le plan de retour arrière |
Pour une PME, le pipeline peut s'arrêter à la recette, et la production se déployer par le script lancé à la main : c'est ce que fait Sorbier pour la première version de Prêt'Matos, en attendant d'avoir confiance dans la chaîne. Les détails sont dans le cours Intégration continue.
Les stratégies de bascule
Une fois le service installé, il reste à décider comment les utilisateurs passent de l'ancien fonctionnement au nouveau. Le choix dépend du risque, du nombre d'utilisateurs et de la possibilité de faire tourner les deux en même temps.
| Stratégie | Principe | Avantage | Inconvénient | Exemple |
|---|---|---|---|---|
| Bascule directe (big bang) | Tout le monde passe au même moment | Simple, pas de double fonctionnement | Si ça casse, tout le monde est touché | Prêt'Matos remplace le tableur un lundi matin |
| Par vagues, avec un groupe pilote | Un petit groupe d'abord, puis le reste en plusieurs étapes | Les problèmes apparaissent sur peu de personnes ; on corrige entre deux vagues | Plus long ; deux fonctionnements à gérer pendant la transition | L'agent GLPI déployé d'abord sur les 3 postes du service informatique, puis sur 5 postes, puis sur tous |
| En parallèle (double run) | L'ancien et le nouveau tournent côte à côte, on compare | Très sûr pour des calculs sensibles (paie, facturation) | Double saisie, coûteux, à limiter dans le temps | Une nouvelle application de paie vérifiée sur deux mois contre l'ancienne |
| Bleu-vert | Deux productions identiques ; on bascule le trafic de l'une à l'autre | Retour arrière instantané | Deux fois les ressources ; la base de données doit rester compatible | Une boutique en ligne qui ne peut pas s'arrêter |
| Canari | Une petite part du trafic va à la nouvelle version, puis plus | Risque mesuré sur de vrais utilisateurs | Demande un répartiteur de charge et une bonne supervision | Un service web à fort trafic |
Pour un service interne de PME, la bascule directe ou par vagues couvre presque tous les cas. Le bleu-vert et le canari supposent une infrastructure que peu de PME ont : le cours Intégration continue les met en œuvre.
Reprendre les données de l'ancien outil
La reprise de données (ou migration de données) fait passer dans le nouveau service les informations utiles de l'ancien : un tableur, un autre logiciel, des dossiers. Elle se prépare comme un mini-projet, en six temps.
- Inventorier : quelles données existent, lesquelles sont utiles, lesquelles on abandonne ou on archive.
- Nettoyer : doublons, fautes de frappe, champs mal remplis.
- Transformer : faire correspondre les colonnes de l'ancien outil aux champs du nouveau, convertir les formats (dates, codes).
- Importer, d'abord en recette, au moins deux fois, puis en production.
- Contrôler : comptages, totaux, échantillon vérifié par un utilisateur.
- Geler l'ancien outil au moment de la bascule, en le gardant en lecture seule pour la consultation et le retour arrière.
Pour Prêt'Matos, le tableur de la logistique contient trois listes. La reprise donne :
| Donnée | Lignes dans le tableur | Traitement | Lignes importées |
|---|---|---|---|
| Catalogue du matériel | 26 | 2 doublons supprimés (PC-07 et PC 07, VP-02 saisi deux fois) | 24 |
| Réservations à venir | 19 | 2 réservations dont la date était passée, archivées sans import | 17 |
| Prêts en cours (matériel sorti) | 5 | Importés avec le statut « sorti » | 5 |
| Historique des prêts terminés | 312 | Non importé : le tableur est archivé en lecture seule sur srv-partages | 0 |
Le contrôle compare ce qui devait être importé et ce qui l'a été, par une requête simple sur la base après l'import :
SELECT 'materiel' AS donnee, COUNT(*) AS lignes FROM materiel
UNION ALL
SELECT 'reservations a venir', COUNT(*) FROM reservation WHERE statut = 'reservee'
UNION ALL
SELECT 'prets en cours', COUNT(*) FROM reservation WHERE statut = 'sortie';
Le résultat attendu est 24, 17 et 5. Un écart arrête la bascule : on cherche, on corrige, ou l'on applique le retour arrière. Enfin, Nadia vérifie un échantillon : son planning de la semaine dans l'application doit être identique au tableur (les requêtes d'agrégat en SQL).
Déployer côté postes
Beaucoup de services demandent aussi une action sur les postes : un favori dans le navigateur, un lecteur réseau, un agent, un logiciel client, un certificat. À la main, sur 16 postes, c'est long et inégal ; on le fait par les outils de déploiement.
| Besoin | Outil classique en environnement Windows |
|---|---|
| Favori ou raccourci vers le service | Stratégie de groupe (préférences de raccourcis, favoris de Microsoft Edge) |
| Lecteur réseau | Stratégie de groupe, préférences de mappage de lecteurs |
| Logiciel client ou agent | Stratégie de groupe (paquet MSI), Microsoft Intune, script, ou console de déploiement |
| Certificat de l'autorité interne | Stratégie de groupe du domaine (autorités de certification racines de confiance) |
| Paramètres d'une application | Stratégie de groupe, modèles d'administration de l'éditeur |
Le cours Déploiement de postes détaille ces outils. Pour Prêt'Matos, il suffit d'un favori « Prêt de matériel » déployé dans Edge par stratégie de groupe, et d'un lien sur la page d'accueil de l'intranet.
Les tests de fumée et la vérification
Un test de fumée (smoke test) est une vérification rapide, juste après le déploiement, que l'essentiel fonctionne : la page répond, la connexion marche, une écriture en base réussit. S'il échoue, inutile d'aller plus loin : on corrige tout de suite ou l'on applique le retour arrière. Il se fait avant d'annoncer l'ouverture.
Une partie des tests de fumée s'automatise. Ce script, versionné avec le service, vérifie la page, l'API, la redirection vers HTTPS et la date de fin du certificat :
#!/usr/bin/env bash
# Tests de fumée de Prêt'Matos, lancés juste après un déploiement.
# Usage : ./tests-fumee.sh https://pretmatos.ad.sorbier.example
set -uo pipefail
BASE="${1:?Usage : tests-fumee.sh <adresse https du service>}"
HOTE="${BASE#https://}"
ECHECS=0
verifier() { # verifier "<libellé>" <commande> [arguments…]
local libelle="$1"
shift
if "$@" > /dev/null 2>&1; then
echo "OK $libelle"
else
echo "KO $libelle"
ECHECS=$((ECHECS + 1))
fi
}
redirige_vers_https() {
local entetes
entetes=$(curl --silent --head --max-time 10 "http://$HOTE/")
grep -qi '^location: https://' <<< "$entetes"
}
certificat_valable_30_jours() {
local certificat
certificat=$(openssl s_client -connect "$HOTE:443" -servername "$HOTE" < /dev/null 2> /dev/null)
openssl x509 -noout -checkend 2592000 <<< "$certificat"
}
verifier "page d'accueil" curl --fail --silent --max-time 10 "$BASE/"
verifier "route de santé de l'API" curl --fail --silent --max-time 10 "$BASE/api/sante"
verifier "redirection HTTP vers HTTPS" redirige_vers_https
verifier "certificat valable 30 jours" certificat_valable_30_jours
if [ "$ECHECS" -eq 0 ]; then
echo "Tests de fumée : tout est vert."
else
echo "Tests de fumée : $ECHECS échec(s). Ne pas ouvrir le service." >&2
exit 1
fi
| Élément | Rôle |
|---|---|
set -uo pipefail | Une variable non définie arrête le script ; l'option -e est absente exprès, pour que tous les tests s'exécutent même si l'un échoue |
verifier | Lance une commande, affiche OK ou KO, compte les échecs |
--fail | curl renvoie une erreur si le serveur répond par un code HTTP d'erreur (404, 500…) |
-checkend 2592000 | openssl renvoie une erreur si le certificat expire dans moins de 30 jours (2 592 000 secondes) |
exit 1 | Le script échoue : un pipeline s'arrête, un humain sait qu'il ne doit pas ouvrir |
Le reste se vérifie à la main, avec un compte de test : se connecter avec un compte du domaine, créer puis annuler une réservation, déclencher un rappel de test, vérifier que la sauvegarde de la nuit est programmée. Puis un utilisateur référent fait le tour de ses écrans habituels : c'est l'étape 6 du plan, la vérification par Nadia.
Le journal de mise en production
Le journal de mise en production note, pendant l'opération, l'heure, l'action, le résultat et chaque écart au plan. Il sert pendant l'opération (où en est-on ?), juste après (la décision s'appuie dessus), et longtemps après (que s'est-il passé ce jour-là, en cas d'incident trois semaines plus tard ?).
| Heure | Étape | Résultat | Écart, décision |
|---|---|---|---|
| 9 h 02 | 2. Instantané de srv-pretmatos | OK, instantané avant-1-0-0 | |
| 9 h 18 | 3. Déploiement 1.0.0 | OK, quatre conteneurs sains | |
| 9 h 51 | 4. Import | Catalogue 24, réservations 17, prêts 5 | Conforme aux comptages attendus |
| 10 h 20 | 5. Tests de fumée | 3 OK, 1 KO : redirection HTTP absente | Le port 80 n'était pas publié par le proxy |
| 10 h 34 | 5 bis. Correction du port 80 dans compose.yaml, redéploiement du proxy seul | OK, tests de fumée 4/4 | Correction reportée dans le dépôt et dans le mode opératoire |
| 10 h 52 | 6. Vérification par Nadia | Planning identique au tableur | |
| 11 h 15 | 7. Décision | Go : service conservé, ouverture lundi 8 h | Décision d'Antoine, notée dans la demande de changement |
Remarque la ligne 5 bis : l'écart est corrigé et reporté dans le dépôt et dans le mode opératoire. Une correction faite seulement sur le serveur serait perdue au prochain déploiement.
Exercices
Exercice 1 sur 4 Quelle façon de déployer ? Réussi À revoir
Pour chaque situation, propose une façon de déployer (manuelle, script, pipeline) et justifie.
- Installer une fois pour toutes une imprimante réseau dans la salle de réunion.
- Mettre à jour chaque semaine l'API d'une application interne qui a une bonne suite de tests automatiques.
- Créer, pour chaque nouveau service de l'entreprise, un groupe dans l'annuaire, un dossier partagé avec ses droits et un lecteur réseau.
- Configurer à l'identique l'agent de supervision sur 25 serveurs Linux.
Voir la réponseMasquer la réponse de l'exercice 1
- Manuelle, avec un mode opératoire court : une opération unique, sur un seul équipement. La procédure écrite servira au prochain remplacement.
- Pipeline : des versions fréquentes et des tests automatiques ; la production attend une approbation.
- Script (PowerShell) : une opération répétée à chaque création de service, toujours la même, où un oubli de droit est une faille. Le script prend le nom du service en paramètre.
- Ansible (un outil de configuration, donc un script idempotent) : 25 machines à rendre identiques, et à garder identiques dans le temps.
Tu avais trouvé ?
Exercice 2 sur 4 Choisir une stratégie de bascule Réussi À revoir
Propose une stratégie de bascule et justifie en deux phrases.
- Remplacer le logiciel de facturation d'une PME, qui émet 400 factures par mois.
- Déployer un nouvel antivirus sur les 180 postes d'un bailleur social réparti sur trois sites.
- Ouvrir un portail de demandes d'assistance à 14 salariés, en remplacement des appels et des courriels.
- Mettre à jour le site public de suivi des livraisons, qui ne doit pas s'interrompre en journée.
Voir la réponseMasquer la réponse de l'exercice 2
- En parallèle, sur un ou deux cycles de facturation : on émet avec le nouveau logiciel et on compare avec l'ancien. Une erreur de facturation coûte cher et se voit tard.
- Par vagues avec un groupe pilote : un pilote varié (un poste par service et par site), puis site par site. Un antivirus mal réglé peut bloquer des logiciels métier : mieux vaut le découvrir sur dix postes que sur 180.
- Bascule directe : peu d'utilisateurs, aucun calcul sensible, et deux canaux en même temps seraient source de confusion. Le téléphone reste possible pour les urgences, saisi dans l'outil par le technicien.
- Bleu-vert, ou une mise à jour hors des heures de service si l'infrastructure ne permet pas deux environnements : le retour arrière doit être immédiat sur un service public.
Tu avais trouvé ?
Exercice 3 sur 4 Le contrôle de la reprise Réussi À revoir
Après l'import en production, la requête de contrôle renvoie : materiel 25, reservations a venir 17, prets en cours 4.
- Que concluent ces chiffres ?
- Que fais-tu, et dans quel ordre ?
Voir la réponseMasquer la réponse de l'exercice 3
- Deux écarts : un matériel de trop (25 au lieu de 24, sans doute un doublon non nettoyé, ou une ligne d'en-tête importée comme un matériel) et un prêt en cours de moins (4 au lieu de 5 : une ligne rejetée, peut-être à cause d'un matériel introuvable, celui qui est mal orthographié ?). Les deux écarts sont peut-être liés.
- Tu n'ouvres pas le service. Tu cherches les lignes en cause (la liste des matériels triée par référence, le journal de l'import), tu corriges le fichier source dans la recette, tu rejoues l'import en recette, puis en production, après avoir remis la base à zéro. Si la cause n'est pas trouvée avant l'heure limite du plan, tu appliques le retour arrière. Et tu notes tout dans le journal.
Tu avais trouvé ?
Exercice 4 sur 4 Un script qui ment Réussi À revoir
Un technicien a écrit ce script de déploiement :
#!/usr/bin/env bash
cd /srv/pretmatos
docker compose pull
docker compose up -d
echo "Déploiement réussi"
Donne trois défauts et la correction de chacun.
Voir la réponseMasquer la réponse de l'exercice 4
- Il ne s'arrête pas sur une erreur : si
cdéchoue, les commandes suivantes s'exécutent dans un autre dossier ; sipulléchoue, il démarre l'ancienne version. Correction :set -euo pipefailen tête. - Il affiche « Déploiement réussi » sans rien vérifier. Correction : attendre que la route de santé réponde, lancer les tests de fumée, et renvoyer un code d'erreur sinon.
- Il ne dit pas quelle version il déploie et ne mémorise pas la précédente : impossible de savoir ce qui tourne ni d'y revenir. Correction : recevoir la version en paramètre, la vérifier, l'écrire dans
.env, et garder la version précédente pour le retour arrière.
On peut ajouter : aucune trace (rediriger la sortie vers un journal daté) et aucune sauvegarde de la base avant de lancer d'éventuelles migrations.
Tu avais trouvé ?