Обчисліть список різниці між пакетами, встановленими на двох хостах


11

Я просто додаю деякі проблеми з моїми віртуальними серверами Debian і додаю перевстановити їх з нуля. Однак у мене все ще був доступ до старої версії, і я міг отримати список встановлених пакетів.

Щоб полегшити процес відновлення віртуального сервера в майбутньому, я хотів би створити список конкретних пакетів для кожного свого сервера.

Щоб краще пояснити, чого я хочу досягти. У мене вже є автоматизований процес створення нового віртуального сервера з базовим пакетом і конфігурацією, що використовується скрізь. Тепер я хочу зберегти дельту за допомогою цього «скелета», щоб полегшити перевстановлення певного сервера.

Справжнім плюсом буде також збереження змінених файлів конфігурації від замовчування, але я можу жити лише зі списком пакунків.

Коротше кажучи, я хочу, щоб створити список пакунків, встановлених на хості, а не на іншому.

Це буде справді чудово, якщо список містить лише встановлені вручну пакети, а не список усіх залежностей.

Якщо у вас є деякі існуючі інструменти, призначені для досягнення цієї конкретної задачі, сміливо пропонуйте їх, але я хочу, щоб залежність була якомога меншою. Для інформації вони не зовсім віртуальні сервери, а контейнери LXC.


Просто думка, але, можливо, прийшов час почати працювати над цим у протилежному напрямку. Замість того, щоб намагатися витягнути інформацію, навіщо налаштовувати систему управління конфігурацією (маріонетку). Потім висувайте речі до керованих систем.
Зоредаче

О, BTW, дивіться це питання. serverfault.com/questions/3852/…
Zoredache

@Zoredache Я зараз шукаю дещо кращий спосіб управління усім цим, але тим часом я хотів знайти якийсь швидкий спосіб зберегти стан серверів на всякий випадок. Дякуємо за посилання!
krtek

Відповіді:


12

Щодо опорної установки (лише один раз):

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

(Передбачається наступне bash)

Щоб отримати пакети, додані з довідкової установки (це не показує, що було видалено):

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

Ще краще, уникаючи копії baselist.txt:

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

2

на старому сервері запустіть:

dpkg --get-select> old-пакети-список

скопіюйте наведений вище файл на новий сервер і запустіть його на новому сервері:

dpkg - набір вибору <список старих пакетів

apt-get update

вибрати вибір оновлення

Крім того, не забудьте додати всі додаткові сховища зі /etc/apt/sources.listстарого сервера на новий сервер, також перед цим переміщенням пакетів, як ніби ви цього не зробите, більшість пакетів залишаться не встановленими.


Це дозволить зберегти весь список пакунків, і саме це рішення я використав для відновлення серверів. Але тепер, щоб полегшити процес у майбутньому, я хочу лише зберегти список пакетів, який відрізняється від базового сервера.
кртек

1
ОК, це дуже просто. Спершу візьміть резервну копію списку зі старого сервера за допомогою "dpkg --get-select> old-пакети-список", потім отримайте список пакетів на новому сервері "dpkg --get-select" > new-package-list ",,, запустіть цю команду" cat old-пакети-список | awk '{print $ 1}'> old-list ",,, та сама команда на новому сервері, але замініть стару новою. запустіть diff для обох файлів, що покаже вам різницю. від diff -w old-list new-list
Farhan

1
cut -f1буде ймовірно, що швидше, ніж awk, і, як коментує відповідь Халед, diff не завжди поверне правильний результат. Рішення з commдійсно, будь ласка, на даний момент ... Однак я пропускаю версію, в якій перераховані лише встановлені вручну пакети.
кртек

1

Ви можете використовувати таку команду, щоб отримати повний список пакетів на обох серверах:

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

Потім ви можете отримати відмінності, використовуючи:

     diff -Nur old_file new_file > changes.txt

Ви можете відфільтрувати необхідні зміни за допомогою grep. Також diff може бути використаний для отримання змін у файлах конфігурації та генерування патчів, які потрібно застосувати за потреби. До речі, diff може порівняти дві папки не лише два файли.


Проблема розрізного висновку полягає в тому, що він не може безпосередньо подаватися на apt-get, щоб перевстановити все в автоматичному режимі ... І, як і запропонований Shellholic, використання комунікацій краще в цьому конкретному випадку, diff може забезпечити неправильні результати, якщо Список пакетів дійсно довгий.
кртек

Інша проблема полягає в тому, що dpkg автоматизує стовпчик виводу. Таким чином, dpkg -l від сервера з довшою назвою пакета ускладнює розбіжність.
Паоло

1

План розроблений саме для ваших потреб. Він плює встановлені пакети опису та конфігурує файли, які були змінені. Він може перетворити ці описи в сценарії лялькових чи шеф-кухарів, щоб застосувати їх до чистих коробок.


0

Також знайшов цей корисний пакет, опис якого такий:

Сценарій Bash, який порівнює дерево файлової системи пакета Debian з поточним деревом файлової системи, друк уніфікований відрізняється для файлів, які відрізняються.

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

Просто один файл bash, який ви можете десь вставити у свій PATH і запустити - здається, працює для мене, і він не надто старий.

Сподіваюся, що це комусь допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.