Activité : automatiser la FAAQ avec un script bash
Pourquoi automatiser?
Section intitulée « Pourquoi automatiser? »Dans l’activité précédente, tu as configuré la plateforme FAAQ à la main — utilisateurs, groupes, dossiers, permissions. Une vingtaine de commandes à taper sans te tromper.
Imagine maintenant :
- Tu dois refaire la même installation sur un autre serveur (production).
- Tu veux recommencer depuis zéro parce que tu as fait une erreur.
- Un nouveau club s’ajoute à la fédération et il faut répéter une partie du travail.
Taper 20 commandes à la main chaque fois, c’est lent, source d’erreurs, et franchement pas professionnel. La solution est d’écrire un script : un fichier qui contient toutes les commandes, exécutable en une seule ligne.
Dans cette activité, tu vas écrire un script bash qui reproduit l’installation complète de la plateforme FAAQ. L’objectif final :
sudo ./installer-faaq.shUne seule commande, et toute la configuration est en place.
Partie 1 — Premiers pas avec bash
Section intitulée « Partie 1 — Premiers pas avec bash »Qu’est-ce qu’un script bash?
Section intitulée « Qu’est-ce qu’un script bash? »Un script bash est un fichier texte qui contient des commandes shell. Quand tu l’exécutes, bash lit le fichier ligne par ligne et exécute chaque commande, comme si tu les tapais toi-même dans le terminal.
Le shebang
Section intitulée « Le shebang »La toute première ligne d’un script bash est toujours la même :
#!/bin/bashCette ligne — appelée shebang — indique au système quel programme doit exécuter le fichier. #!/bin/bash dit : « interprète ce script avec bash ». Sans cette ligne, le système ne sait pas comment exécuter le fichier.
Commentaires
Section intitulée « Commentaires »Toute ligne qui commence par # (sauf le shebang) est un commentaire — bash l’ignore. Les commentaires sont là pour expliquer le code à ceux qui le lisent (toi dans trois semaines, par exemple).
#!/bin/bash
# Ceci est un commentaire.# Bash ne l'exécute pas.
echo "Bonjour" # Les commentaires peuvent aussi finir une ligneVariables
Section intitulée « Variables »Comme en JavaScript, les variables stockent des valeurs que tu peux réutiliser. En bash :
# Définition : PAS d'espace autour du =nom="Alice"age=30
# Utilisation : on préfixe avec $echo "Bonjour $nom, tu as $age ans"Exécuter un script
Section intitulée « Exécuter un script »-
Créer le fichier — avec l’extension
.shpar convention.Fenêtre de terminal touch hello.shnano hello.sh -
Écrire le contenu — avec le shebang en première ligne.
#!/bin/bashecho "Bonjour, bash!" -
Rendre le fichier exécutable — permission
x.Fenêtre de terminal chmod +x hello.sh -
L’exécuter — avec
./devant le nom.Fenêtre de terminal ./hello.sh# Bonjour, bash!
Exercice 1 : Ton premier script
Section intitulée « Exercice 1 : Ton premier script »Crée un script identite.sh qui :
- Commence par un shebang.
- A un commentaire expliquant ce qu’il fait.
- Définit une variable avec ton nom.
- Affiche un message personnalisé qui utilise la variable.
Exercice 2 : Construire une phrase
Section intitulée « Exercice 2 : Construire une phrase »Crée un script presentation.sh qui :
- Définit trois variables : ton prénom, ton âge et ta ville.
- Affiche une phrase complète en utilisant ces trois variables.
Exemple de sortie attendue :
Je m'appelle Alice, j'ai 20 ans et j'habite à Montréal.Exercice 3 : Variables en contexte réaliste
Section intitulée « Exercice 3 : Variables en contexte réaliste »Dans les scripts professionnels, les variables servent à regrouper les informations qu’on pourrait vouloir modifier plus tard à un seul endroit. C’est ce pattern que tu vas utiliser dans le script FAAQ.
Crée un script info-fichier.sh qui :
- Définit trois variables :
nom_fichier,dossier,taille. - Affiche une phrase décrivant le fichier.
Exemple de sortie attendue :
Le fichier rapport.pdf est dans /home/alice/documents et fait 450 Ko.Partie 2 — Les boucles for
Section intitulée « Partie 2 — Les boucles for »Le problème à résoudre
Section intitulée « Le problème à résoudre »Dans l’exercice FAAQ, tu as tapé plusieurs fois la même commande, en changeant seulement le nom de l’utilisateur :
sudo adduser alicesudo adduser bobsudo adduser carolTrois noms, trois commandes presque identiques. Imagine avec 50 membres à créer. Les boucles sont faites pour ça.
Syntaxe for
Section intitulée « Syntaxe for »for variable in element1 element2 element3; do # commandes à répéter # $variable prend tour à tour chaque valeurdoneExemple concret :
for fruit in pomme poire prune; do echo "J'aime la $fruit"doneRésultat :
J'aime la pommeJ'aime la poireJ'aime la pruneBoucler sur une variable contenant plusieurs valeurs
Section intitulée « Boucler sur une variable contenant plusieurs valeurs »Tu peux stocker une liste dans une variable, puis boucler dessus :
utilisateurs="alice bob carol"
for nom in $utilisateurs; do echo "Utilisateur : $nom"doneExercice 4 : Boucle avec création d’utilisateurs
Section intitulée « Exercice 4 : Boucle avec création d’utilisateurs »Écris un script creer-utilisateurs.sh qui utilise une boucle for pour créer plusieurs utilisateurs d’un coup.
- Définis une variable contenant une liste de noms de test (par exemple
testuser_a testuser_b). - Boucle sur cette liste avec
for, et appelleaddusersur chaque nom. - Ajoute un
echode confirmation après chaque création.
Partie 3 — Construction progressive du script FAAQ
Section intitulée « Partie 3 — Construction progressive du script FAAQ »Maintenant que tu maîtrises les briques de base, on va construire le script d’installation FAAQ étape par étape. Tu vas ajouter une section à la fois, puis tester avant de passer à la suivante.
Préparation
Section intitulée « Préparation »-
Crée le fichier :
Fenêtre de terminal touch installer-faaq.shchmod +x installer-faaq.sh -
Ouvre-le avec
nanoou un autre éditeur. -
Commence par le shebang et un commentaire d’en-tête :
#!/bin/bash# Script d'installation de la plateforme FAAQ.# Crée les utilisateurs, groupes, dossiers et permissions.
Étape 1 : Les variables de configuration
Section intitulée « Étape 1 : Les variables de configuration »Commencer par définir toutes les valeurs qui pourraient changer (noms d’utilisateurs, chemins). Les regrouper au début du script est une bonne pratique : si tu dois les modifier plus tard, tu n’as qu’un seul endroit à changer.
Ajoute ces lignes après l’en-tête :
# === Configuration ===UTILISATEURS_MTL="alice bob"UTILISATEURS_QC="carol"ADMIN="fed_admin"RACINE="/faaq"Test de l’étape 1 — pour vérifier que les variables sont bien définies, ajoute temporairement à la fin du script :
echo "Admin: $ADMIN"echo "Montréal: $UTILISATEURS_MTL"echo "Québec: $UTILISATEURS_QC"echo "Racine: $RACINE"Lance le script : sudo ./installer-faaq.sh. Tu devrais voir les quatre valeurs s’afficher. Supprime ensuite ces lignes de test avant de passer à l’étape 2.
Étape 2 : Créer les utilisateurs
Section intitulée « Étape 2 : Créer les utilisateurs »Plutôt que trois adduser individuels, on boucle sur les trois catégories d’utilisateurs (admin, Montréal, Québec).
# === 1. Créer les utilisateurs ===echo "Création des utilisateurs..."
for utilisateur in $ADMIN $UTILISATEURS_MTL $UTILISATEURS_QC; do adduser --disabled-password --gecos "" "$utilisateur"doneDeux choses à noter :
$ADMIN $UTILISATEURS_MTL $UTILISATEURS_QC— bash concatène les valeurs en une seule liste de noms. Pouralice bob+carol+fed_admin, on obtientfed_admin alice bob carol.--disabled-password --gecos ""— ces options rendentaddusernon interactif. Sans mot de passe ni questions à l’étudiant : parfait pour un script. Les comptes sont créés « sans mot de passe configuré » (tu pourrais en définir un plus tard avecpasswd).
Test de l’étape 2 — lance le script, puis vérifie :
getent passwd fed_admin alice bob carolTu devrais voir quatre lignes, une par utilisateur.
Étape 3 : Créer les groupes
Section intitulée « Étape 3 : Créer les groupes »Même principe : une boucle sur les quatre groupes.
# === 2. Créer les groupes ===echo "Création des groupes..."
for groupe in faaq_admin faaq_membres club_mtl club_qc; do addgroup "$groupe"doneTest — relance le script (après nettoyage) et vérifie :
getent group faaq_admin faaq_membres club_mtl club_qcÉtape 4 : Affecter les utilisateurs aux groupes
Section intitulée « Étape 4 : Affecter les utilisateurs aux groupes »C’est ici que les boucles brillent vraiment. Les membres d’un club partagent tous la même affectation — une boucle pour Montréal, une pour Québec.
# === 3. Affecter aux groupes ===echo "Affectation aux groupes..."
usermod -aG faaq_admin,faaq_membres "$ADMIN"
for utilisateur in $UTILISATEURS_MTL; do usermod -aG club_mtl,faaq_membres "$utilisateur"done
for utilisateur in $UTILISATEURS_QC; do usermod -aG club_qc,faaq_membres "$utilisateur"doneTest — vérifie qu’alice est bien dans club_mtl et faaq_membres :
groups alice# alice : alice users club_mtl faaq_membresÉtape 5 : Créer la structure de dossiers
Section intitulée « Étape 5 : Créer la structure de dossiers »Un seul mkdir -p avec l’expansion d’accolades (vu dans l’activité précédente) crée l’arborescence principale. Ensuite une boucle pour les dossiers personnels des membres.
# === 4. Créer la structure ===echo "Création de la structure..."
mkdir -p "$RACINE"/{admin,public,clubs/{montreal,quebec},membres}
for utilisateur in $UTILISATEURS_MTL $UTILISATEURS_QC; do mkdir -p "$RACINE/membres/$utilisateur"doneTest — affiche l’arborescence :
ls -R /faaqTu devrais voir /faaq/admin, /faaq/public, /faaq/clubs/montreal, /faaq/clubs/quebec, /faaq/membres/alice, /faaq/membres/bob, /faaq/membres/carol.
Étape 6 : Définir les propriétaires
Section intitulée « Étape 6 : Définir les propriétaires »Les dossiers « fixes » reçoivent leur propriétaire et groupe un par un. Les dossiers des membres, eux, se prêtent à une boucle.
# === 5. Définir les propriétaires ===echo "Définition des propriétaires..."
chown root:faaq_membres "$RACINE"chown "$ADMIN":faaq_admin "$RACINE/admin"chown "$ADMIN":faaq_membres "$RACINE/public"chown root:faaq_membres "$RACINE/clubs"chown "$ADMIN":club_mtl "$RACINE/clubs/montreal"chown "$ADMIN":club_qc "$RACINE/clubs/quebec"chown root:faaq_membres "$RACINE/membres"
for utilisateur in $UTILISATEURS_MTL $UTILISATEURS_QC; do chown "$utilisateur":"$utilisateur" "$RACINE/membres/$utilisateur"doneTest — vérifie avec ls -ld :
ls -ld /faaq /faaq/*/ /faaq/clubs/*/ /faaq/membres/*/Étape 7 : Appliquer les permissions
Section intitulée « Étape 7 : Appliquer les permissions »Finalement, les permissions. Les dossiers de clubs reçoivent le bit setgid (le 2 devant 770) pour que les fichiers créés par les membres appartiennent au groupe du club.
# === 6. Appliquer les permissions ===echo "Application des permissions..."
chmod 750 "$RACINE"chmod 770 "$RACINE/admin"chmod 755 "$RACINE/public"chmod 755 "$RACINE/clubs"chmod 2770 "$RACINE/clubs/montreal"chmod 2770 "$RACINE/clubs/quebec"chmod 755 "$RACINE/membres"
for utilisateur in $UTILISATEURS_MTL $UTILISATEURS_QC; do chmod 700 "$RACINE/membres/$utilisateur"done
echo ""echo "✓ Installation FAAQ terminée."Test final — après un nettoyage complet et une exécution du script, vérifie toute l’arborescence :
ls -ld /faaq /faaq/*/ /faaq/clubs/*/ /faaq/membres/*/Tu devrais voir exactement la même configuration que dans l’exercice manuel précédent.