Parfois, vous avez besoin d'une solution légère, sans dépendances, qui fonctionne sur n'importe quel système de type Unix. C'est là que sed et awk brillent :

  • Ils sont disponibles sur pratiquement tous les systèmes de type Unix
  • Pas besoin d'installations supplémentaires ou de dépendances
  • Exécution ultra-rapide pour des modifications à la volée
  • Assez puissants pour gérer des transformations complexes

Le Duo Dynamique en Action

Commençons par un scénario réel : vous devez générer un fichier de configuration Nginx de manière dynamique en fonction des variables d'environnement et d'un modèle. Voici un modèle avec lequel travailler :


server {
    listen 80;
    server_name {{SERVER_NAME}};
    
    location / {
        proxy_pass {{UPSTREAM_URL}};
    }
}

Maintenant, utilisons sed pour remplacer ces espaces réservés par des valeurs réelles :


#!/bin/bash

SERVER_NAME="example.com"
UPSTREAM_URL="http://backend:8080"

sed -e "s/{{SERVER_NAME}}/$SERVER_NAME/g" \
    -e "s|{{UPSTREAM_URL}}|$UPSTREAM_URL|g" \
    nginx.template > nginx.conf

Ce script lit le modèle, remplace les espaces réservés et génère un nouveau fichier de configuration. Simple, non ? Mais que faire si nous avons besoin de quelque chose de plus complexe ?

Passer au Niveau Supérieur : Configuration Multi-Serveurs

Disons que vous avez une liste de serveurs backend et que vous souhaitez générer un bloc upstream de manière dynamique. C'est là qu'awk excelle :


#!/bin/bash

SERVERS="server1:8080 server2:8081 server3:8082"

echo "upstream backend {"
echo "$SERVERS" | awk '{
    split($0, servers, " ")
    for (i in servers) {
        split(servers[i], parts, ":")
        printf "    server %s:%s;\n", parts[1], parts[2]
    }
}'
echo "}"

Ce script générera un bloc upstream comme celui-ci :


upstream backend {
    server server1:8080;
    server server2:8081;
    server server3:8082;
}

L'Intrigue S'épaissit : Génération de Configurations Conditionnelles

Maintenant, combinons sed et awk pour une configuration vraiment dynamique. Nous allons créer un script qui génère différentes configurations en fonction de l'environnement :


#!/bin/bash

ENV=${1:-production}
TEMPLATE="nginx.template"

# Générer la liste des serveurs en fonction de l'environnement
if [ "$ENV" = "production" ]; then
    SERVERS="prod1:8080 prod2:8080 prod3:8080"
else
    SERVERS="dev1:8080"
fi

# Générer le bloc upstream
UPSTREAM=$(echo "$SERVERS" | awk '{
    print "upstream backend {"
    split($0, servers, " ")
    for (i in servers) {
        split(servers[i], parts, ":")
        printf "    server %s:%s;\n", parts[1], parts[2]
    }
    print "}"
}')

# Remplacer les espaces réservés dans le modèle
sed -e "s/{{ENV}}/$ENV/g" \
    -e "s|{{UPSTREAM_BLOCK}}|$UPSTREAM|g" \
    "$TEMPLATE" > "nginx_$ENV.conf"

Ce script prend un environnement en argument, génère un bloc upstream approprié, puis utilise sed pour l'insérer dans la configuration finale.

Pièges à Éviter

Bien que sed et awk soient puissants, ils ont leurs particularités :

  • Méfiez-vous des caractères spéciaux dans vos remplacements. Utilisez des délimiteurs différents (comme | au lieu de /) si nécessaire.
  • Le séparateur de champs par défaut d'awk est l'espace. Utilisez -F pour le changer si besoin.
  • N'oubliez pas que sed traite l'entrée ligne par ligne, ce qui peut limiter certaines opérations.

Aller Plus Loin

Une fois que vous maîtrisez ces bases, vous pouvez faire des choses vraiment impressionnantes :

  • Générer des configurations HAProxy complexes basées sur des données de découverte de services
  • Mettre à jour dynamiquement les chaînes de connexion de base de données dans plusieurs fichiers de configuration
  • Créer des configurations d'application spécifiques à l'environnement au démarrage du conteneur

Conclusion

Sed et awk peuvent sembler être des reliques d'une époque révolue, mais ils sont encore incroyablement pertinents pour les pratiques modernes de DevOps. Leur capacité à effectuer des transformations de texte complexes rapidement et sans dépendances en fait des outils inestimables pour la gestion dynamique des configurations.

Rappelez-vous, la prochaine fois que vous êtes confronté à un cauchemar de configuration, ne vous précipitez pas vers un système de gestion de configuration lourd. Parfois, un peu de magie avec sed et awk est tout ce dont vous avez besoin pour sauver la situation (et votre santé mentale).

"Donnez-moi sed, awk, et un point d'appui, et je soulèverai le monde." - Archimède (s'il était ingénieur DevOps)

Maintenant, allez de l'avant et dominez ces configurations !