Passer au contenu principal

Automatisation (Linux)

Bash avancé

Au-delà des bases, quelques outils et patterns permettent d'écrire des scripts de production : traitement de texte avec sed et awk, parsing d'arguments, here-documents, et gestion des cas limites.

Traitement de texte

sed : stream editor

sed 's/ancien/nouveau/g' fichier.txt              # remplacer toutes les occurrences
sed -i 's/ancien/nouveau/g' fichier.txt           # modification en place
sed -n '/pattern/p' fichier.txt                   # afficher les lignes matching
sed '/pattern/d' fichier.txt                      # supprimer les lignes matching
sed -i "s/PORT=22/PORT=${NOUVEAU_PORT}/" /etc/ssh/sshd_config  # variable dans sed

awk : traitement par colonnes

awk '{print $1}' fichier.txt               # première colonne
awk '{print $1, $3}' fichier.txt           # colonnes 1 et 3
awk -F: '{print $1}' /etc/passwd           # délimiteur personnalisé (:)
awk -F: '$3 >= 1000 {print $1}' /etc/passwd  # UID >= 1000 (utilisateurs réels)

Parsing d'arguments

#!/bin/bash
set -euo pipefail

usage() {
    echo "Usage: $0 [-h] [-e ENV] [-n NOM]"
    exit 1
}

ENV="prod"
NOM=""

while getopts "he:n:" opt; do
    case $opt in
        e) ENV="$OPTARG" ;;
        n) NOM="$OPTARG" ;;
        h) usage ;;
        *) usage ;;
    esac
done

[ -n "$NOM" ] || usage
echo "Déploiement de $NOM sur $ENV"

Here-documents

Les here-documents permettent d'écrire du contenu multi-lignes directement dans un script, avec interpolation des variables :

# Créer un fichier de configuration à partir de variables
cat > /etc/app/config.conf << EOF
HOST=${DB_HOST}
PORT=${DB_PORT}
NAME=${DB_NAME}
EOF

# Désactiver l'interpolation (littéral)
cat > /etc/app/template.conf << 'EOF'
HOST=${DB_HOST}   # non interpolé
EOF

Verrou et vérifications défensives

# Vérifier qu'une commande est disponible
command -v rsync &>/dev/null || apt install -y rsync

# Vérifier les dépendances au démarrage
check_deps() {
    for cmd in rsync ssh jq; do
        command -v "$cmd" &>/dev/null || die "Commande manquante : $cmd"
    done
}

# Verrou pour éviter l'exécution simultanée
LOCKFILE=/tmp/mon-script.lock
exec 9>"$LOCKFILE"
flock -n 9 || die "Script déjà en cours d'exécution"

En pratique

Un script de déploiement ou de sauvegarde en production doit gérer trois cas : l'exécution normale, l'échec d'une étape (trap EXIT), et l'exécution concurrente (flock). awk -F: '$3 >= 1000 {print $1}' /etc/passwd est le genre d'extraction qu'on utilise pour générer une liste d'utilisateurs à auditer. La combinaison sed -i + variables permet de templéter des fichiers de configuration sans recourir à des outils externes. À partir d'un certain seuil de complexité ou dès que plusieurs machines sont impliquées, Ansible prend le relais.