Berechnen Sie eine Liste der Unterschiede zwischen Paketen, die auf zwei Hosts installiert sind


11

Ich füge nur einige Probleme mit meinen virtuellen Debian-Servern hinzu und füge hinzu, um alle von Grund auf neu zu installieren. Ich hatte jedoch immer noch Zugriff auf die alte Version und konnte die Liste der installierten Pakete abrufen.

Um die Wiederherstellung eines virtuellen Servers in Zukunft zu vereinfachen, möchte ich für jeden meiner Server eine Liste spezifischer Pakete erstellen.

Um besser zu erklären, was ich erreichen möchte. Ich habe bereits einen automatisierten Prozess zum Erstellen eines neuen virtuellen Servers mit einigen grundlegenden Paketen und Konfigurationen, die überall verwendet werden. Jetzt möchte ich das Delta mit diesem "Skelett" speichern, um die Neuinstallation eines bestimmten Servers zu vereinfachen.

Ein echtes Plus wird sein, auch die geänderten Konfigurationsdateien aus der Standardeinstellung zu speichern, aber ich kann nur mit der Paketliste leben.

Kurz gesagt, ich möchte eine Möglichkeit zum Erstellen einer Liste von Paketen erstellen, die auf einem Host installiert sind, jedoch nicht auf einem anderen.

Es ist wirklich großartig, wenn die Liste nur manuell installierte Pakete enthält und nicht die Liste aller Abhängigkeiten.

Wenn Sie über einige Tools verfügen, die für diese spezielle Aufgabe entwickelt wurden, können Sie diese gerne vorschlagen, aber ich möchte die Abhängigkeit so gering wie möglich halten. Zur Information, es handelt sich nicht gerade um virtuelle Server, sondern um LXC-Container.


Nur ein Gedanke, aber es könnte an der Zeit sein, aus der entgegengesetzten Richtung daran zu arbeiten. Anstatt zu versuchen, die Informationen abzurufen, sollten Sie ein Konfigurationsmanagementsystem (Puppet) einrichten. Dann schieben Sie die Dinge auf Ihre verwalteten Systeme.
Zoredache

Übrigens, sehen Sie diese Frage. serverfault.com/questions/3852/…
Zoredache

@Zoredache Ich suche derzeit nach einer besseren Möglichkeit, dies alles zu verwalten, aber in der Zwischenzeit wollte ich einen schnellen Weg finden, um den Status der Server für alle Fälle zu speichern. Danke für den Link !
krtek

Antworten:


12

Bei der Referenzinstallation (nur einmal):

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

(Das Folgende setzt voraus bash)

So fügen Sie die Pakete aus der Referenzinstallation hinzu (dies zeigt nicht an, was entfernt wurde):

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

Noch besser: Vermeiden Sie Kopien von baselist.txt:

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

2

Führen Sie auf einem alten Server Folgendes aus:

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

Kopieren Sie die obige Datei auf einen neuen Server und führen Sie diese auf einem neuen Server aus:

dpkg --set-selections <Liste der alten Pakete

apt-get update

Update auswählen

Denken Sie auch daran /etc/apt/sources.list, vor dieser Migration von Paketen alle zusätzlichen Repositorys vom alten zum neuen Server hinzuzufügen. Wenn Sie dies nicht tun, werden die meisten Pakete nicht installiert.


Dadurch wird die gesamte Paketliste gespeichert, und es ist genau die Lösung, mit der ich die Server wiederhergestellt habe. Um den Prozess in Zukunft zu vereinfachen, möchte ich jetzt nur die Liste der Pakete speichern, die sich vom Basisserver unterscheidet.
krtek

1
ok, das ist auch sehr einfach. erst eine Sicherungskopie der Liste vom alten Server mit "dpkg --get-selections> old-packages-list" erstellen und dann die Liste der Pakete auf dem neuen Server mit "dpkg --get-selections" abrufen > new-packages-list ",,, führe diesen Befehl aus" cat old-packages-list | awk '{print $ 1}'> old-list ",,, der gleiche Befehl auf dem neuen Server, aber ersetze den alten durch den neuen. Führen Sie für beide Dateien einen Unterschied aus, der Ihnen den Unterschied zeigt. von diff -w alte Liste neue Liste
Farhan

1
cut -f1wird wahrscheinlich schneller als awk sein und wie in der Antwort von Khaled kommentiert, wird diff nicht immer ein richtiges Ergebnis zurückgeben. Die Lösung mit commwirklich bitte vorerst ... Allerdings fehlt mir eine Version, die nur manuell installierte Pakete auflistet.
krtek

1

Mit dem folgenden Befehl können Sie die vollständige Liste der Pakete auf beiden Servern abrufen:

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

Dann können Sie die Unterschiede ermitteln, indem Sie:

     diff -Nur old_file new_file > changes.txt

Sie können die erforderlichen Änderungen mit grep filtern. Außerdem kann diff verwendet werden, um die Änderungen in den Konfigurationsdateien abzurufen und Patches zu generieren, die bei Bedarf angewendet werden können. Übrigens kann diff zwei Ordner vergleichen, nicht nur zwei Dateien.


Das Problem mit der Diff-Ausgabe ist, dass sie nicht direkt an apt-get weitergeleitet werden kann, um alles automatisch neu zu installieren ... Und wie bei Shellholic vorgeschlagen, ist die Verwendung von comm in diesem speziellen Fall besser, diff liefert möglicherweise falsche Ergebnisse, wenn die Paketliste ist wirklich lang.
krtek

Ein weiteres Problem ist, dass dpkg die Spalte der Ausgabe automatisch automatisiert. Ein dpkg -l von einem Server mit einem längeren Paketnamen macht den Unterschied also schwierig.
Paolo

1

Blueprint ist genau auf Ihre Bedürfnisse zugeschnitten. Es spuckt ein installiertes Beschreibungspaket und Konfigurationsdateien aus, die geändert wurden. Diese Beschreibungen können in Puppet- oder Chef-Skripte konvertiert werden, um sie auf saubere Boxen anzuwenden.


0

Ich habe auch dieses hilfreiche Paket gefunden, dessen Beschreibung wie folgt lautet:

Ein Bash-Skript, das den Dateisystembaum eines Debian-Pakets mit dem aktuellen Dateisystembaum vergleicht und einheitliche Unterschiede für Dateien druckt, die sich unterscheiden.

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

Nur eine einzige Bash-Datei, die Sie irgendwo in Ihren PATH stecken und ausführen können - scheint für mich zu funktionieren und ist nicht zu alt.

Hoffe das hilft jemandem.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.