Hitung daftar perbedaan antara paket yang diinstal pada dua host

11

Saya hanya menambahkan beberapa masalah dengan server virtual Debian saya dan saya tambahkan untuk menginstal ulang semuanya dari awal. Namun, saya masih memiliki akses ke versi lama dan saya bisa mengambil daftar paket yang diinstal.

Untuk memfasilitasi proses memulihkan server virtual di masa mendatang, saya ingin membuat daftar paket khusus untuk masing-masing server saya.

Untuk lebih menjelaskan apa yang ingin saya capai. Saya sudah memiliki proses otomatis untuk membuat server virtual baru dengan beberapa paket dasar dan konfigurasi yang digunakan di mana-mana. Sekarang saya ingin menyimpan delta dengan "kerangka" ini untuk memudahkan instalasi ulang server tertentu.

Nilai plus nyata adalah juga untuk menyimpan file konfigurasi yang diubah dari default, tetapi saya hanya bisa hidup dengan daftar paket.

Singkatnya, saya ingin cara membuat daftar paket yang diinstal pada host tetapi tidak pada yang lain.

Akan sangat bagus jika daftar hanya berisi paket yang diinstal secara manual dan bukan daftar semua dependensi.

Jika Anda memiliki beberapa alat yang sudah ada yang dirancang untuk mencapai tugas khusus ini, jangan ragu untuk mengusulkannya, tetapi saya ingin menjaga ketergantungan sekecil mungkin. Sebagai informasi, mereka bukan server virtual, tetapi kontainer LXC.

krtek
sumber
Hanya sebuah pemikiran, tapi mungkin sudah waktunya untuk mulai bekerja dari arah yang berlawanan. Alih-alih mencoba menarik informasi, mengapa harus mengatur sistem manajemen konfigurasi (boneka). Kemudian dorong semuanya ke sistem yang Anda kelola.
Zoredache
Oh, BTW, lihat pertanyaan ini. serverfault.com/questions/3852/…
Zoredache
@ Zoredache Saat ini saya sedang mencari cara yang lebih baik untuk mengelola semua ini, tetapi sementara itu saya ingin mencari cara cepat untuk menyelamatkan keadaan server untuk berjaga-jaga. Terima kasih untuk tautannya!
krtek

Jawaban:

12

Pada instalasi referensi (hanya sekali):

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

(Asumsi berikut bash)

Untuk mendapatkan paket yang ditambahkan dari instalasi referensi (ini tidak menunjukkan apa yang telah dihapus):

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

Lebih baik lagi, menghindari salinan baselist.txt:

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

di server lama, jalankan:

dpkg --get-choices> daftar-paket-lama

salin file di atas ke server baru dan jalankan ini di server baru:

dpkg --set-selection <old-Packages-list

pembaruan apt-get

pilih pembaruan

Juga, ingatlah untuk menambahkan semua repositori tambahan dari /etc/apt/sources.listdari server lama ke server baru juga, sebelum migrasi paket-paket ini, seolah-olah Anda tidak, maka sebagian besar paket akan dibiarkan tidak diinstal.

Farhan
sumber
Ini akan menyimpan seluruh daftar paket, dan ini adalah solusi yang saya gunakan untuk mengembalikan server. Tapi sekarang, untuk mempermudah proses di masa depan, saya hanya ingin menyimpan daftar paket yang berbeda dari server basis.
krtek
1
ok, itu juga sangat mudah., pertama-tama ambil cadangan daftar dari server lama dengan "dpkg - get-choices> old-Packages-list", kemudian dapatkan daftar paket di server baru dengan "dpkg - get-choices > daftar-paket-baru ",,, jalankan perintah ini" cat paket-tua-daftar | awk '{print $ 1}'> daftar-lama ",,, perintah yang sama pada server baru, tetapi ganti yang lama dengan yang baru. jalankan diff pada kedua file, yang akan menunjukkan perbedaannya. oleh diff -w daftar lama daftar baru
Farhan
1
cut -f1mungkin akan lebih cepat daripada awk, dan seperti dikomentari pada jawaban Khaled, diff tidak akan selalu menghasilkan hasil yang benar. Solusi dengan commsangat tolong untuk saat ini ... Namun saya kehilangan versi yang hanya mencantumkan paket yang diinstal secara manual.
krtek
1

Anda dapat menggunakan perintah berikut untuk mendapatkan daftar paket lengkap di kedua server:

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

Kemudian, Anda bisa mendapatkan perbedaan menggunakan:

     diff -Nur old_file new_file > changes.txt

Anda dapat memfilter perubahan yang diperlukan menggunakan grep. Juga, diff dapat digunakan untuk mendapatkan perubahan dalam file konfigurasi dan menghasilkan tambalan yang akan diaplikasikan saat diperlukan. By the way, diff dapat membandingkan dua folder tidak hanya dua file.

Khaled
sumber
Masalah dengan output diff adalah bahwa ia tidak dapat langsung diumpankan ke apt-get untuk menginstal ulang semuanya dengan cara otomatis ... Dan seperti yang diusulkan Shellholic, menggunakan comm lebih baik dalam kasus khusus ini, diff mungkin memberikan hasil yang salah jika daftar paket sangat panjang.
krtek
Masalah lain adalah bahwa dpkg mengotomatiskan kolom output. Jadi dpkg -l dari server dengan nama paket yang lebih panjang membuat diff sulit.
Paolo
1

Cetak biru dirancang sesuai kebutuhan Anda. Itu meludah paket deskripsi yang diinstal dan mengkonfigurasi file yang telah diubah. Itu dapat mengubah deskripsi ini menjadi skrip Wayang atau Chef untuk menerapkannya pada kotak bersih.

Ben Butler-Cole
sumber
0

Juga menemukan paket bermanfaat ini, uraiannya adalah sebagai berikut:

Skrip Bash yang membandingkan pohon sistem file paket Debian dengan pohon sistem file saat ini, mencetak perbedaan unified untuk file yang berbeda.

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

Hanya satu file bash yang bisa Anda tempel di PATH Anda di suatu tempat dan jalankan - tampaknya bekerja untuk saya dan itu tidak terlalu lama.

Semoga ini bisa membantu seseorang.

smaudet
sumber