Oblicz listę różnic między pakietami zainstalowanymi na dwóch hostach

11

Dodałem tylko problemy z moimi wirtualnymi serwerami Debiana i dodałem, aby ponownie zainstalować je wszystkie od zera. Jednak nadal miałem dostęp do starej wersji i mogłem pobrać listę zainstalowanych pakietów.

Aby ułatwić proces przywracania serwera wirtualnego w przyszłości, chciałbym utworzyć listę konkretnych pakietów dla każdego z moich serwerów.

Aby lepiej wyjaśnić, co chcę osiągnąć. Mam już zautomatyzowany proces tworzenia nowego serwera wirtualnego z kilkoma podstawowymi pakietami i konfiguracjami używanymi wszędzie. Teraz chcę zapisać deltę za pomocą tego „szkieletu”, aby ułatwić ponowną instalację konkretnego serwera.

Prawdziwym plusem będzie również zapisanie zmienionych plików konfiguracyjnych z domyślnych, ale mogę żyć tylko z listą pakietów.

Krótko mówiąc, chcę sposób na utworzenie listy pakietów zainstalowanych na hoście, ale nie na innym.

Będzie naprawdę świetnie, jeśli lista zawiera tylko ręcznie zainstalowane pakiety, a nie listę wszystkich zależności.

Jeśli masz jakieś istniejące narzędzia zaprojektowane do osiągnięcia tego konkretnego zadania, możesz je zaproponować, ale chcę, aby zależność była jak najmniejsza. Dla informacji nie są to dokładnie serwery wirtualne, ale kontenery LXC.

krtek
źródło
To tylko myśl, ale może nadszedł czas, aby zacząć nad tym pracować z przeciwnego kierunku. Zamiast próbować wyciągnąć informacje, po co konfigurować system zarządzania konfiguracją (marionetka). Następnie wypchnij rzeczy do systemów zarządzanych.
Zoredache,
Och, BTW, zobacz to pytanie. serverfault.com/questions/3852/…
Zoredache
@Zoredache Obecnie szukam lepszego sposobu na zarządzanie tym wszystkim, ale tymczasem na wszelki wypadek chciałem znaleźć szybki sposób na zachowanie stanu serwerów. Dzięki za link!
krtek

Odpowiedzi:

12

W instalacji referencyjnej (tylko raz):

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

(Zakłada się, że bash)

Aby pobrać pakiety z instalacji referencyjnej (nie pokazuje to, co zostało usunięte):

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

Jeszcze lepiej, unikając kopiowania baselist.txt:

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

na starym serwerze uruchom:

dpkg --get-selections> lista starych pakietów

skopiuj powyższy plik na nowy serwer i uruchom go na nowym serwerze:

dpkg --set-selections <lista starych pakietów

apt-get update

dselect update

Pamiętaj też o dodaniu wszystkich dodatkowych repozytoriów ze /etc/apt/sources.liststarego serwera na nowy serwer, przed migracją pakietów, tak jakbyś tego nie robił, wtedy większość pakietów pozostanie niezainstalowana.

Farhan
źródło
Spowoduje to zapisanie całej listy pakietów i jest to dokładnie rozwiązanie, którego użyłem do przywrócenia serwerów. Ale teraz, aby ułatwić ten proces w przyszłości, chcę zapisać tylko listę pakietów różniącą się od serwera podstawowego.
krtek,
1
ok, to też jest bardzo łatwe. najpierw wykonaj kopię zapasową listy ze starego serwera przez „dpkg --get-selections> old-packages-list”, a następnie pobierz listę pakietów na nowym serwerze przez „dpkg --get-selections > new-packages-list ",,, uruchom tę komendę" cat old-packages-list | awk '{print $ 1}'> old-list ",,, to samo polecenie na nowym serwerze, ale zamień stare na nowe. uruchom diff na obu plikach, co pokaże różnicę. autor: diff -w stara-lista nowa-lista
Farhan
1
cut -f1najprawdopodobniej będzie szybszy niż awk i jak skomentował odpowiedź Khaleda, diff nie zawsze zwraca poprawny wynik. Rozwiązanie commnaprawdę na razie proszę ... Brakuje mi jednak wersji, która zawiera tylko ręcznie zainstalowane pakiety.
krtek,
1

Możesz użyć następującego polecenia, aby uzyskać pełną listę pakietów na obu serwerach:

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

Następnie możesz uzyskać różnice za pomocą:

     diff -Nur old_file new_file > changes.txt

Możesz filtrować potrzebne zmiany za pomocą grep. Można również użyć diff, aby uzyskać zmiany w plikach konfiguracyjnych i wygenerować łatki, które można zastosować w razie potrzeby. Nawiasem mówiąc, diff może porównać dwa foldery nie tylko dwa pliki.

Khaled
źródło
Problem z wyjściem różnicowym polega na tym, że nie można go bezpośrednio podać apt-get w celu automatycznej ponownej instalacji wszystkiego ... I podobnie jak proponowany Shellholic, użycie comm jest lepsze w tym konkretnym przypadku, diff może dawać błędne wyniki, jeśli lista pakietów jest naprawdę długa.
krtek
Innym problemem jest to, że dpkg automatycznie dostosowuje kolumnę danych wyjściowych. Zatem dpkg -l z serwera o dłuższej nazwie pakietu utrudnia diff.
Paolo,
1

Blueprint został zaprojektowany specjalnie dla Ciebie. Pluje zainstalowanymi pakietami opisów i zmienionymi plikami konfiguracyjnymi. Jest w stanie przekonwertować te opisy na skrypty Puppet lub Chef, aby zastosować je do czystych skrzynek.

Ben Butler-Cole
źródło
0

Znalazłem także ten pomocny pakiet, którego opis jest następujący:

Skrypt Bash, który porównuje drzewo systemu plików pakietu Debian z bieżącym drzewem systemu plików, drukując zunifikowane pliki różnic dla plików, które się różnią.

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

Tylko jeden plik bash, który możesz gdzieś włożyć do ŚCIEŻKI i uruchomić - wydaje się, że działa dla mnie i nie jest za stary.

Mam nadzieję, że to komuś pomoże.

smaudet
źródło