Calculer une liste de différence entre les packages installés sur deux hôtes


11

J'ajoute juste quelques problèmes avec mes serveurs virtuels Debian et j'ajoute pour les réinstaller tous à partir de zéro. Cependant, j'avais toujours accès à l'ancienne version et je pouvais récupérer la liste des packages installés.

Afin de faciliter le processus de restauration d'un serveur virtuel à l'avenir, je voudrais créer une liste de packages spécifiques pour chacun de mes serveurs.

Pour mieux expliquer ce que je veux réaliser. J'ai déjà un processus automatisé pour créer un nouveau serveur virtuel avec un package et une configuration de base utilisés partout. Maintenant, je veux enregistrer le delta avec ce "squelette" pour faciliter la réinstallation d'un serveur particulier.

Un véritable avantage sera également de sauvegarder les fichiers de configuration modifiés par défaut, mais je ne peux vivre qu'avec la liste des packages.

En bref, je veux un moyen de créer une liste de packages installés sur un hôte mais pas sur un autre.

Ce sera vraiment génial si la liste ne contient que des packages installés manuellement et non la liste de toutes les dépendances.

Si vous avez des outils existants conçus pour accomplir cette tâche particulière, n'hésitez pas à les proposer, mais je veux garder la dépendance aussi petite que possible. Pour information, ce ne sont pas exactement des serveurs virtuels, mais des conteneurs LXC.


Juste une pensée, mais il serait peut-être temps de commencer à travailler dans ce sens dans la direction opposée. Au lieu d'essayer d'extraire les informations, pourquoi installer un système de gestion de configuration (marionnette). Poussez ensuite les choses vers vos systèmes gérés.
Zoredache

Oh, BTW, voyez cette question. serverfault.com/questions/3852/…
Zoredache

@Zoredache Je cherche actuellement une meilleure façon de gérer tout cela, mais en attendant, je voulais trouver un moyen rapide de sauvegarder l'état des serveurs au cas où. Merci pour le lien !
krtek

Réponses:


12

Sur l'installation de référence (une seule fois):

dpkg-query -W -f='${Package}\n' | sort > baselist.txt

(Ce qui suit suppose bash)

Pour obtenir les packages ajoutés à partir de l'installation de référence (cela ne montre pas ce qui a été supprimé):

comm -1 -3 baselist.txt <(dpkg-query -W -f='${Package}\n' | sort)

Encore mieux, en évitant la copie de baselist.txt:

comm -1 -3 <(ssh user@refserver cat /path/to/baselist.txt) <(dpkg-query -W -f='${Package}\n' | sort)

2

sur l'ancien serveur, exécutez:

dpkg --get-selections> old-packages-list

copiez le fichier ci-dessus sur un nouveau serveur et exécutez-le sur un nouveau serveur:

dpkg --set-selections <ancienne-liste-de-paquets

mise à jour apt-get

mise à jour dselect

N'oubliez pas également d'ajouter tous les référentiels supplémentaires /etc/apt/sources.listde l'ancien serveur au nouveau serveur, avant cette migration des packages, comme si vous ne le faisiez pas, la plupart des packages resteront non installés.


Cela permettra d'économiser la liste complète des packages, et c'est exactement la solution que j'ai utilisée pour restaurer les serveurs. Mais maintenant, pour faciliter le processus à l'avenir, je souhaite enregistrer uniquement la liste des packages qui est différente du serveur de base.
krtek

1
ok, c'est aussi très simple., prenez d'abord la sauvegarde de la liste de l'ancien serveur par "dpkg --get-selections> old-packages-list", puis récupérez la liste des packages sur le nouveau serveur par "dpkg --get-selections > new-packages-list ",,, exécutez cette commande" cat old-packages-list | awk '{print $ 1}'> old-list ",,, même commande sur le nouveau serveur, mais remplacez old par new. exécutez un diff sur les deux fichiers, ce qui vous montrera la différence. par diff -w old-list new-list
Farhan

1
cut -f1sera probablement plus rapide que awk, et comme commenté la réponse de Khaled, diff ne retournera pas toujours un bon résultat. La solution avec commvraiment s'il vous plaît pour l'instant ... Cependant il me manque une version qui ne répertorie que les packages installés manuellement.
krtek

1

Vous pouvez utiliser la commande suivante pour obtenir la liste complète des packages sur les deux serveurs:

     dpkg -l | sort > old_file
     dpkg -l | sort > new_file

Ensuite, vous pouvez obtenir les différences en utilisant:

     diff -Nur old_file new_file > changes.txt

Vous pouvez filtrer les modifications nécessaires à l'aide de grep. En outre, diff peut être utilisé pour obtenir les modifications dans les fichiers de configuration et générer des correctifs à appliquer en cas de besoin. Soit dit en passant, diff peut comparer deux dossiers et non seulement deux fichiers.


Le problème avec la sortie diff est qu'elle ne peut pas être directement alimentée à apt-get pour tout réinstaller de manière automatique ... Et comme proposé Shellholic, l'utilisation de comm est meilleure dans ce cas particulier, diff peut fournir des résultats erronés si le la liste des paquets est vraiment longue.
krtek

Un autre problème est que dpkg redimensionne automatiquement la colonne de sortie. Ainsi, un dpkg -l d'un serveur avec un nom de package plus long rend le diff difficile.
Paolo

1

Blueprint est conçu pour répondre exactement à vos besoins. Il crache une description des packages installés et des fichiers de configuration qui ont été modifiés. Il est capable de convertir ces descriptions en scripts Puppet ou Chef afin de les appliquer à des boîtes propres.


0

A également trouvé ce package utile, dont la description est la suivante:

Un script Bash qui compare l'arborescence du système de fichiers d'un paquet Debian à l'arborescence actuelle du système de fichiers, imprimant des différences unifiées pour les fichiers qui diffèrent.

https://code.google.com/p/dpkg-diffs/

Juste un seul fichier bash que vous pouvez coller quelque part dans votre PATH et exécuter - semble fonctionner pour moi et ce n'est pas trop ancien.

J'espère que cela aide quelqu'un.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.