Tutoriel Linux

Diff sous Linux : comparer deux configurations avant un déploiement

Débutant5 min de lecture
À retenirLinux n'est pas réservé aux experts. Le bon point de départ : une distribution accessible, une sauvegarde propre et quelques commandes comprises.

Vous avez préparé un nouveau fichier de configuration et le service doit partir en production. Avant de copier quoi que ce soit dans /etc, comparez la version active et la candidate avec diff. Une ligne oubliée, une option supprimée ou un espace significatif suffit parfois à empêcher le redémarrage.

La commande ne modifie aucun fichier. Elle affiche les écarts et renvoie un code de sortie que vous pouvez exploiter dans un script. Je vous conseille de commencer par une comparaison stricte, puis d’ignorer uniquement les différences que vous avez identifiées comme sans effet.

Tux compare deux configurations Linux avant leur déploiement
Diff révèle les lignes ajoutées et retirées avant une modification en production.

Copier la configuration active avant la comparaison

Travaillez sur une copie lisible par votre compte plutôt que de modifier directement la production. Adaptez les chemins au service concerné :

command -v diff
diff --version

mkdir -p "$HOME/revue-config"
sudo cp -a /etc/mon-service/service.conf "$HOME/revue-config/service.conf.active"
cp ./service.conf.candidate "$HOME/revue-config/service.conf.candidate"

ls -l "$HOME/revue-config"

cp -a conserve les attributs de la copie active, mais le fichier placé dans votre home peut contenir un mot de passe, une clé API ou une chaîne de connexion. Limitez les droits du dossier si nécessaire :

chmod 700 "$HOME/revue-config"
chmod 600 "$HOME/revue-config"/*.conf

Vérifiez le propriétaire et le mode du fichier original séparément. La comparaison du contenu ne prouve pas que les permissions, le propriétaire ou le contexte SELinux de la future configuration sont corrects.

Commencer par une réponse courte avec diff -q

Pour savoir rapidement si les fichiers diffèrent, utilisez le mode bref :

cd "$HOME/revue-config"
diff -q service.conf.active service.conf.candidate

Aucune sortie signifie que les contenus sont identiques. Si une différence existe, diff l’annonce sans afficher les lignes. Le code de retour apporte une information essentielle :

  • 0 : fichiers identiques ;
  • 1 : différences trouvées ;
  • 2 ou davantage : erreur de lecture, chemin absent ou autre problème d’exécution.

Ne traitez donc pas le code 1 comme une panne. Dans un script, distinguez-le d’une vraie erreur :

if diff -q service.conf.active service.conf.candidate >/dev/null; then
  printf 'Configurations identiques\n'
else
  rc=$?
  if (( rc == 1 )); then
    printf 'Différences à examiner\n'
  else
    printf 'Erreur diff, code %s\n' "$rc" >&2
    exit "$rc"
  fi
fi

Lire le format unifié avec diff -u

Le format unifié est le plus lisible pour une revue et le plus proche d’un patch. Lancez :

diff -u service.conf.active service.conf.candidate

La ligne qui commence par --- désigne l’ancien fichier, celle qui commence par +++ le nouveau. Un en-tête comme @@ -12,4 +12,5 @@ situe le bloc dans les deux versions. Dans ce bloc, - marque une ligne retirée, + une ligne ajoutée et un espace une ligne de contexte inchangée.

Relisez aussi les suppressions. Une option absente de la candidate peut être plus dangereuse qu’une valeur ajoutée. Pour des noms plus explicites dans le rapport, utilisez des libellés :

diff -u \
  --label configuration-active \
  --label configuration-candidate \
  service.conf.active service.conf.candidate

La page de manuel de diff détaille les formats et les options GNU utilisées ici.

Ignorer les espaces seulement après une première lecture

Une indentation ou un espace final peut produire beaucoup de bruit. Comparez d’abord sans filtre. Si vous avez confirmé que les espaces concernés ne changent pas la syntaxe du service, essayez une option ciblée :

diff -u --ignore-trailing-space service.conf.active service.conf.candidate
diff -u -b service.conf.active service.conf.candidate
diff -u -B service.conf.active service.conf.candidate

--ignore-trailing-space ignore les espaces en fin de ligne. -b ignore les changements dans la quantité d’espaces et -B les blocs composés uniquement de lignes vides. L’option -w ignore tous les espaces et masque davantage d’écarts. Évitez-la pour YAML, Python, Makefile ou toute configuration dont l’indentation porte un sens.

Si l’objectif est ensuite de modifier une valeur précise, le guide sur sed sous Linux montre comment tester le remplacement dans un nouveau fichier et contrôler le résultat avant sed -i.

Comparer deux arborescences sans ouvrir chaque fichier

Pour comparer deux dossiers de configuration, commencez par une vue courte et récursive :

diff -qr /srv/config-active /srv/config-candidate

La sortie indique les fichiers différents et ceux présents d’un seul côté. Affichez ensuite le détail en excluant seulement les fichiers temporaires connus :

diff -ur \
  --exclude='*.log' \
  --exclude='*.tmp' \
  /srv/config-active /srv/config-candidate

Ne masquez pas un dossier complet simplement parce que la sortie est longue. Vérifiez d’abord son rôle avec find. Pour synchroniser ensuite une arborescence validée, utilisez rsync avec un --dry-run plutôt qu’une copie aveugle.

Conserver un patch de revue sans toucher à la production

Vous pouvez enregistrer le format unifié dans un fichier. Comme diff renvoie 1 lorsqu’il trouve des écarts, gérez ce statut explicitement :

umask 077

if diff -u \
  --label service.conf.active \
  --label service.conf.candidate \
  service.conf.active service.conf.candidate >service.conf.patch; then
  printf 'Aucun changement\n'
  rm -f service.conf.patch
else
  rc=$?
  if (( rc == 1 )); then
    less service.conf.patch
  else
    printf 'Comparaison impossible, code %s\n' "$rc" >&2
    rm -f service.conf.patch
    exit "$rc"
  fi
fi

Le patch devient une pièce de revue : vous pouvez le joindre au ticket, le faire relire et archiver la décision. Il peut aussi contenir des secrets présents dans les lignes modifiées. Gardez-le en mode 600, ne le placez pas dans un dépôt public et supprimez-le quand il n’est plus nécessaire.

Avant le déploiement, validez la syntaxe avec l’outil du service, par exemple sshd -t, nginx -t ou une commande de vérification propre à l’application. Contrôlez ensuite le propriétaire, les permissions et le mécanisme de retour arrière. diff vous montre l’écart, mais ne peut pas décider si la nouvelle configuration est valide.

sudo apt update && sudo apt upgrade