Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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.

ActionQuestionPrêt'Matos
InstallerLes composants sont-ils en place, dans la bonne version ?Images 1.0.0 téléchargées, conteneurs créés
ConfigurerChaque composant a-t-il la configuration de la production ?Fichier .env, secrets, certificat, adresse du relais, groupes de l'annuaire
Reprendre les donnéesL'historique utile est-il dans le nouvel outil ?Catalogue du matériel, réservations à venir, prêts en cours
Ouvrir l'accèsLes utilisateurs peuvent-ils l'atteindre ?Alias DNS, règle du pare-feu, lien sur l'intranet, favori sur les postes
VérifierLe service fonctionne-t-il vraiment, vu de l'utilisateur ?Tests de fumée, contrôle de l'import, vérification par Nadia
TracerPeut-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 manuelleScriptPipeline CI/CD
PrincipeUn technicien suit un mode opératoire écrit, étape par étapeUn script (Bash, PowerShell) ou un outil de configuration (Ansible) exécute les étapesUne modification validée déclenche la construction, les tests et le déploiement, avec une approbation pour la production
Rejouable à l'identiqueNon : chaque exécution dépend de la personneOuiOui
Risque d'erreur humaineÉlevé (étape sautée, faute de frappe)FaibleFaible
TraçabilitéLe journal tenu à la mainLa sortie du script, à conserverL'historique du pipeline, automatique
Effort de mise en placeAucun, sauf écrire la procédureMoyenPlus élevé
Quand le choisirUn déploiement unique, ou rare, sur un petit périmètreDes déploiements réguliers, plusieurs serveurs, un retour arrière à automatiserDes 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 :

ÉtapeActionRésultat attendu
3.1Se connecter à srv-pretmatos depuis le bastion : ssh moussa@srv-pretmatosInvite de commande de srv-pretmatos
3.2Aller dans le dossier du service : cd /srv/pretmatosLe dossier contient compose.yaml, Caddyfile, .env, certs/, secrets/
3.3Vérifier la version demandée : cat .envVERSION=1.0.0
3.4Valider la configuration : sudo docker compose config --quiet && echo validevalide
3.5Télécharger les images : sudo docker compose pullLes quatre images sont téléchargées, sans erreur
3.6Démarrer : sudo docker compose up -dQuatre conteneurs créés
3.7Attendre l'état sain : sudo docker compose psbdd 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 :

  1. Il s'arrête à la première erreur (set -euo pipefail en Bash, $ErrorActionPreference = 'Stop' en PowerShell) au lieu de continuer sur un état cassé.
  2. 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.
  3. 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).
  4. 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.
  5. Il sait revenir en arrière : il mémorise la version précédente et sait la redémarrer.
  6. 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 pipelineCorrespond à
Construire et testerTests unitaires et d'intégration (chapitre 4)
Publier l'image avec un numéro de versionLa version figée de la recette
Déployer en recetteL'environnement de recette (chapitre 3)
Attendre l'approbationLa décision go/no-go et la demande de changement
Déployer en production, vérifierLe script, les tests de fumée
Revenir à la version précédente si la vérification échoueLe 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.

Bascule directeanciennouveautout le monde, le même joursimple, mais si ça casse,tout le monde est touchéPar vaguespilotevague 2vague 3un groupe pilote, puis lereste, vague après vagueEn parallèleanciennouveauon comparesûr, mais doublesaisie pendant un tempsBleu-verttraficbleu : v1vert : v2on bascule tout le trafic,retour arrière immédiatCanaritraficv1 : 95 %v2 : 5 %une petite part du traficessaie la nouvelle version
Cinq façons de faire passer les utilisateurs au nouveau service
StratégiePrincipeAvantageInconvénientExemple
Bascule directe (big bang)Tout le monde passe au même momentSimple, pas de double fonctionnementSi ça casse, tout le monde est touchéPrêt'Matos remplace le tableur un lundi matin
Par vagues, avec un groupe piloteUn petit groupe d'abord, puis le reste en plusieurs étapesLes problèmes apparaissent sur peu de personnes ; on corrige entre deux vaguesPlus long ; deux fonctionnements à gérer pendant la transitionL'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 compareTrès sûr pour des calculs sensibles (paie, facturation)Double saisie, coûteux, à limiter dans le tempsUne nouvelle application de paie vérifiée sur deux mois contre l'ancienne
Bleu-vertDeux productions identiques ; on bascule le trafic de l'une à l'autreRetour arrière instantanéDeux fois les ressources ; la base de données doit rester compatibleUne boutique en ligne qui ne peut pas s'arrêter
CanariUne petite part du trafic va à la nouvelle version, puis plusRisque mesuré sur de vrais utilisateursDemande un répartiteur de charge et une bonne supervisionUn 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.

  1. Inventorier : quelles données existent, lesquelles sont utiles, lesquelles on abandonne ou on archive.
  2. Nettoyer : doublons, fautes de frappe, champs mal remplis.
  3. Transformer : faire correspondre les colonnes de l'ancien outil aux champs du nouveau, convertir les formats (dates, codes).
  4. Importer, d'abord en recette, au moins deux fois, puis en production.
  5. Contrôler : comptages, totaux, échantillon vérifié par un utilisateur.
  6. 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éeLignes dans le tableurTraitementLignes importées
Catalogue du matériel262 doublons supprimés (PC-07 et PC 07, VP-02 saisi deux fois)24
Réservations à venir192 réservations dont la date était passée, archivées sans import17
Prêts en cours (matériel sorti)5Importés avec le statut « sorti »5
Historique des prêts terminés312Non importé : le tableur est archivé en lecture seule sur srv-partages0

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 :

sql
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.

BesoinOutil classique en environnement Windows
Favori ou raccourci vers le serviceStratégie de groupe (préférences de raccourcis, favoris de Microsoft Edge)
Lecteur réseauStratégie de groupe, préférences de mappage de lecteurs
Logiciel client ou agentStratégie de groupe (paquet MSI), Microsoft Intune, script, ou console de déploiement
Certificat de l'autorité interneStratégie de groupe du domaine (autorités de certification racines de confiance)
Paramètres d'une applicationStraté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 :

bash
#!/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émentRôle
set -uo pipefailUne 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
verifierLance une commande, affiche OK ou KO, compte les échecs
--failcurl renvoie une erreur si le serveur répond par un code HTTP d'erreur (404, 500…)
-checkend 2592000openssl renvoie une erreur si le certificat expire dans moins de 30 jours (2 592 000 secondes)
exit 1Le 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ÉtapeRésultatÉcart, décision
9 h 022. Instantané de srv-pretmatosOK, instantané avant-1-0-0
9 h 183. Déploiement 1.0.0OK, quatre conteneurs sains
9 h 514. ImportCatalogue 24, réservations 17, prêts 5Conforme aux comptages attendus
10 h 205. Tests de fumée3 OK, 1 KO : redirection HTTP absenteLe port 80 n'était pas publié par le proxy
10 h 345 bis. Correction du port 80 dans compose.yaml, redéploiement du proxy seulOK, tests de fumée 4/4Correction reportée dans le dépôt et dans le mode opératoire
10 h 526. Vérification par NadiaPlanning identique au tableur
11 h 157. DécisionGo : service conservé, ouverture lundi 8 hDé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.

  1. Installer une fois pour toutes une imprimante réseau dans la salle de réunion.
  2. Mettre à jour chaque semaine l'API d'une application interne qui a une bonne suite de tests automatiques.
  3. 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.
  4. Configurer à l'identique l'agent de supervision sur 25 serveurs Linux.
Voir la réponseMasquer la réponse de l'exercice 1
  1. Manuelle, avec un mode opératoire court : une opération unique, sur un seul équipement. La procédure écrite servira au prochain remplacement.
  2. Pipeline : des versions fréquentes et des tests automatiques ; la production attend une approbation.
  3. 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.
  4. 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.

  1. Remplacer le logiciel de facturation d'une PME, qui émet 400 factures par mois.
  2. Déployer un nouvel antivirus sur les 180 postes d'un bailleur social réparti sur trois sites.
  3. Ouvrir un portail de demandes d'assistance à 14 salariés, en remplacement des appels et des courriels.
  4. 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
  1. 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.
  2. 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.
  3. 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.
  4. 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.

  1. Que concluent ces chiffres ?
  2. Que fais-tu, et dans quel ordre ?
Voir la réponseMasquer la réponse de l'exercice 3
  1. 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.
  2. 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 :

bash
#!/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
  1. Il ne s'arrête pas sur une erreur : si cd échoue, les commandes suivantes s'exécutent dans un autre dossier ; si pull échoue, il démarre l'ancienne version. Correction : set -euo pipefail en tête.
  2. 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.
  3. 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é ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Accompagner les utilisateurs : communication, formation et supportRevoir le sommaire du cours