Calcola un elenco di differenze tra i pacchetti installati su due host


11

Aggiungo solo alcuni problemi con i miei server virtuali Debian e li aggiungo per reinstallarli tutti da zero. Tuttavia, avevo ancora accesso alla versione precedente e potevo recuperare l'elenco dei pacchetti installati.

Al fine di facilitare il processo di ripristino di un server virtuale in futuro, vorrei creare un elenco di pacchetti specifici per ciascuno dei miei server.

Per spiegare meglio ciò che voglio ottenere. Ho già un processo automatizzato per creare un nuovo server virtuale con alcuni pacchetti e configurazioni di base utilizzati ovunque. Ora voglio salvare il delta con questo "scheletro" per facilitare la reinstallazione di un determinato server.

Un vero vantaggio sarà anche quello di salvare i file di configurazione modificati dal valore predefinito, ma posso vivere solo con l'elenco dei pacchetti.

In breve, voglio un modo per creare un elenco di pacchetti installati su un host ma non su un altro.

Sarà davvero fantastico se l'elenco contiene solo pacchetti installati manualmente e non l'elenco di tutte le dipendenze.

Se disponi di alcuni strumenti esistenti progettati per svolgere questo particolare compito, sentiti libero di proporli, ma voglio mantenere la dipendenza il più piccola possibile. Per informazione, non sono esattamente server virtuali, ma contenitori LXC.


Solo un pensiero, ma potrebbe essere il momento di iniziare a lavorare su questo dalla direzione opposta. Invece di provare a estrarre le informazioni, perché impostare un sistema di gestione della configurazione (burattino). Quindi inviare le cose ai sistemi gestiti.
Zoredache,

Oh, BTW, vedi questa domanda. serverfault.com/questions/3852/…
Zoredache il

@Zoredache Attualmente sto cercando un modo migliore per gestire tutto questo, ma nel frattempo volevo trovare un modo rapido per salvare lo stato dei server per ogni evenienza. Grazie per il link!
Krtek,

Risposte:


12

Sull'installazione di riferimento (solo una volta):

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

(Il seguente presuppone bash)

Per ottenere i pacchetti aggiunti dall'installazione di riferimento (questo non mostra ciò che è stato rimosso):

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

Ancora meglio, evitando la copia di baselist.txt:

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

2

sul vecchio server, eseguire:

dpkg --get-selections> old-pacchetti-list

copia il file sopra sul nuovo server ed eseguilo sul nuovo server:

dpkg --set-selections <elenco-pacchetti-vecchi

apt-get update

dselect update

Inoltre, ricorda di aggiungere tutti i repository extra /etc/apt/sources.listdal vecchio server al nuovo server, prima di questa migrazione di pacchetti, come se non lo facessi, quindi la maggior parte dei pacchetti rimarrà non installata.


Ciò salverà l'intero elenco di pacchetti ed è esattamente la soluzione che ho usato per ripristinare i server. Ma ora, per facilitare il processo in futuro, voglio solo salvare l'elenco dei pacchetti che è diverso dal server di base.
Krtek,

1
ok, anche questo è molto semplice. prima prendi il backup dell'elenco dal vecchio server da "dpkg --get-selections> vecchio-pacchetti-elenco", quindi ottieni l'elenco dei pacchetti sul nuovo server da "dpkg --get-selections > new-package-list ",,, esegui questo comando" cat old-pacchetti-list | awk '{print $ 1}'> old-list ",,, stesso comando sul nuovo server, ma sostituisci vecchio con nuovo. esegui un diff su entrambi i file, che ti mostrerà la differenza. di diff -w old-list new-list
Farhan,

1
cut -f1sarà probabilmente più veloce di awk e, come commentato sulla risposta di Khaled, diff non restituirà sempre un risultato giusto. La soluzione con commdavvero per favore per ora ... Tuttavia mi manca una versione che elenca solo i pacchetti installati manualmente.
Krtek,

1

È possibile utilizzare il comando seguente per ottenere l'elenco completo dei pacchetti su entrambi i server:

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

Quindi, puoi ottenere le differenze usando:

     diff -Nur old_file new_file > changes.txt

Puoi filtrare le modifiche necessarie usando grep. Inoltre, diff può essere utilizzato per ottenere le modifiche nei file di configurazione e generare patch da applicare quando necessario. A proposito, diff può confrontare due cartelle non solo due file.


Il problema con l'output diff è che non può essere alimentato direttamente per apt-get per reinstallare tutto in modo automatico ... E come proposto Shellholic, usando comm è meglio in questo caso particolare, diff potrebbe fornire risultati errati se il la lista dei pacchetti è davvero lunga.
Krtek,

Un altro problema è che dpkg ridimensiona automaticamente la colonna dell'output. Quindi un dpkg -l da un server con un nome di pacchetto più lungo rende difficile la diff.
Paolo

1

Blueprint è progettato esattamente per le tue esigenze. Sputa i pacchetti di descrizione installati e configura i file che sono stati modificati. È in grado di convertire queste descrizioni in script Puppet o Chef per applicarle a riquadri puliti.


0

Ho anche trovato questo utile pacchetto, la cui descrizione è la seguente:

Uno script Bash che confronta l'albero dei filesystem di un pacchetto Debian con l'albero dei filesystem corrente, stampando differenze unificate per file diversi.

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

Solo un singolo file bash che puoi inserire nel tuo PERCORSO da qualche parte ed eseguire - sembra funzionare per me e non è troppo vecchio.

Spero che questo aiuti qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.