Tính toán danh sách chênh lệch giữa các gói được cài đặt trên hai máy chủ


11

Tôi chỉ thêm một số vấn đề với máy chủ ảo Debian của mình và tôi thêm để cài đặt lại tất cả chúng từ đầu. Tuy nhiên, tôi vẫn có quyền truy cập vào phiên bản cũ và tôi có thể truy xuất danh sách các gói đã cài đặt.

Để tạo điều kiện thuận lợi cho quá trình khôi phục máy chủ ảo trong tương lai, tôi muốn tạo một danh sách các gói cụ thể cho từng máy chủ của mình.

Để giải thích rõ hơn những gì tôi muốn đạt được. Tôi đã có một quy trình tự động để tạo một máy chủ ảo mới với một số gói và cấu hình cơ bản được sử dụng ở mọi nơi. Bây giờ tôi muốn lưu delta bằng "bộ xương" này để dễ dàng cài đặt lại một máy chủ cụ thể.

Một điểm cộng thực sự cũng là lưu các tệp cấu hình đã thay đổi từ mặc định, nhưng tôi chỉ có thể sống với danh sách gói.

Nói tóm lại, tôi muốn một cách để tạo một danh sách các gói được cài đặt trên một máy chủ nhưng không phải trên một gói khác.

Sẽ thực sự tuyệt vời nếu danh sách chỉ chứa các gói được cài đặt thủ công và không có danh sách tất cả các phụ thuộc.

Nếu bạn có một số công cụ hiện có được thiết kế để đạt được nhiệm vụ cụ thể này, vui lòng đề xuất chúng, nhưng tôi muốn giữ sự phụ thuộc càng nhỏ càng tốt. Để biết thông tin, chúng không chính xác là máy chủ ảo, mà là các thùng chứa LXC.


Chỉ là một ý nghĩ, nhưng có lẽ đã đến lúc bắt đầu làm việc này từ hướng ngược lại. Thay vì cố gắng kéo thông tin, tại sao phải thiết lập một hệ thống quản lý cấu hình (con rối). Sau đó đẩy mọi thứ ra hệ thống quản lý của bạn.
Zoredache

Oh, BTW, xem câu hỏi này. serverfault.com/questions/3852/ Ấn
Zoredache

@Zoredache Tôi hiện đang tìm kiếm một cách tốt hơn để quản lý tất cả điều này, nhưng trong lúc này tôi muốn tìm một cách nhanh chóng để cứu trạng thái của các máy chủ chỉ trong trường hợp. Cảm ơn các liên kết !
krtek

Câu trả lời:


12

Về cài đặt tham chiếu (chỉ một lần):

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

(Các giả định sau bash)

Để có được các gói được thêm từ cài đặt tham chiếu (điều này không hiển thị những gì đã bị xóa):

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

Thậm chí tốt hơn, tránh bản sao của baselist.txt:

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

2

trên máy chủ cũ, chạy:

dpkg --get-select> old-gói-list

sao chép tệp trên vào máy chủ mới và chạy tệp này trên máy chủ mới:

dpkg --set-select <old-gói-list

cập nhật apt-get

cập nhật

Ngoài ra, hãy nhớ thêm tất cả các kho lưu trữ bổ sung từ /etc/apt/sources.listmáy chủ cũ sang máy chủ mới, trước khi di chuyển các gói này, nếu bạn không, thì hầu hết các gói sẽ không được cài đặt.


Điều này sẽ lưu toàn bộ danh sách các gói và nó chính xác là giải pháp tôi đã sử dụng để khôi phục các máy chủ. Nhưng bây giờ, để giảm bớt quá trình trong tương lai, tôi muốn chỉ lưu danh sách các gói khác với máy chủ cơ sở.
krtek

1
ok, điều đó cũng rất dễ dàng > new-gói-list ",,, chạy lệnh này" cat old-tests-list | awk '{print $ 1}'> old-list ",,, cùng một lệnh trên máy chủ mới, nhưng thay thế cũ bằng mới. chạy một khác biệt trên cả hai tập tin, điều này sẽ cho bạn thấy sự khác biệt. bởi diff -w old-list new-list
Farhan

1
cut -f1sẽ có thể nhanh hơn awk và như nhận xét về câu trả lời của Khaled, diff sẽ không trả về kết quả đúng. Giải pháp commthực sự vui lòng cho đến bây giờ ... Tuy nhiên, tôi đang thiếu một phiên bản chỉ liệt kê các gói được cài đặt thủ công.
krtek

1

Bạn có thể sử dụng lệnh sau để lấy danh sách đầy đủ các gói trên cả hai máy chủ:

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

Sau đó, bạn có thể nhận được sự khác biệt bằng cách sử dụng:

     diff -Nur old_file new_file > changes.txt

Bạn có thể lọc các thay đổi cần thiết bằng grep. Ngoài ra, diff có thể được sử dụng để có được các thay đổi trong tệp cấu hình và tạo các bản vá để được bổ sung khi cần. Nhân tiện, diff có thể so sánh hai thư mục không chỉ hai tệp.


Vấn đề với đầu ra khác là nó không thể được cung cấp trực tiếp cho apt-get để cài đặt lại mọi thứ theo cách tự động ... Và giống như Shellholic đề xuất, sử dụng comm sẽ tốt hơn trong trường hợp cụ thể này, diff có thể cung cấp kết quả sai nếu danh sách gói thực sự dài.
krtek

Một vấn đề khác là dpkg tự động hóa cột đầu ra. Vì vậy, một dpkg -l từ một máy chủ có tên gói dài hơn làm cho diff trở nên khó khăn.
Paolo

1

Blueprint được thiết kế cho chính xác nhu cầu của bạn. Nó nhổ một gói mô tả được cài đặt và cấu hình các tập tin đã được thay đổi. Nó có thể chuyển đổi các mô tả này thành tập lệnh Puppet hoặc Chef để áp dụng chúng vào các hộp sạch.


0

Cũng tìm thấy gói hữu ích này, mô tả về nó như sau:

Một tập lệnh Bash so sánh cây hệ thống tập tin của gói Debian với cây hệ thống tập tin hiện tại, in các khác biệt thống nhất cho các tệp khác nhau.

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

Chỉ cần một tệp bash duy nhất bạn có thể dán vào PATH của mình ở đâu đó và chạy - dường như hoạt động với tôi và nó không quá cũ.

Hy vọng điều này sẽ giúp được ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.