Вычислить список различий между пакетами, установленными на двух хостах


11

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

Чтобы облегчить процесс восстановления виртуального сервера в будущем, я хотел бы создать список определенных пакетов для каждого из моих серверов.

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

Настоящим плюсом будет также сохранение измененных файлов конфигурации из настроек по умолчанию, но я могу жить только со списком пакетов.

Короче говоря, я хочу создать список пакетов, установленных на хосте, но не на другом.

Будет действительно здорово, если список содержит только установленные вручную пакеты, а не список всех зависимостей.

Если у вас есть некоторые инструменты, предназначенные для решения этой конкретной задачи, не стесняйтесь предлагать их, но я хочу сохранить зависимость как можно меньше. Для информации - это не виртуальные серверы, а контейнеры LXC.


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

О, кстати, смотрите этот вопрос. serverfault.com/questions/3852/…
Zoredache

@Zoredache В настоящее время я ищу какой-то лучший способ справиться со всем этим, но в то же время я хотел найти какой-нибудь быстрый способ сохранить состояние серверов на всякий случай. Спасибо за ссылку!
Кртек

Ответы:


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-selection> старый список пакетов

скопируйте вышеуказанный файл на новый сервер и запустите его на новом сервере:

dpkg --set-selections <старый-пакет-список

apt-get update

dselect update

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


Это сохранит весь список пакетов, и это именно то решение, которое я использовал для восстановления серверов. Но теперь, чтобы облегчить процесс в будущем, я хочу сохранить только список пакетов, который отличается от базового сервера.
кртек

1
Хорошо, это тоже очень просто. Сначала сделайте резервную копию списка со старого сервера с помощью «dpkg --get-selections> old-packages-list», затем получите список пакетов на новом сервере с помощью «dpkg --get-selections». > new-packages-list ",,, запустить эту команду" cat old-packages-list | awk '{print $ 1}'> old-list ",,, та же команда на новом сервере, но заменить старую на новую. Запустите diff для обоих файлов, и вы увидите разницу. от diff -w old-list new-list
Фархан

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 может сравнивать две папки, а не только два файла.


Проблема с выводом diff состоит в том, что он не может быть напрямую передан apt-get для автоматической переустановки всего ... И, как и в случае предложенного Shellholic, использование comm лучше в данном конкретном случае, diff может дать неправильные результаты, если Список пакетов действительно длинный.
кртек

Другая проблема заключается в том, что dpkg автоматически изменяет размер столбца вывода. Таким образом, dpkg -l с сервера с более длинным именем пакета усложняет процесс сравнения.
Паоло

1

План разработан именно для ваших нужд. Он выплевывает описание установленных пакетов и конфигурационных файлов, которые были изменены. Он может преобразовать эти описания в сценарии Puppet или Chef, чтобы применить их к чистым коробкам.


0

Также найден этот полезный пакет, описание которого выглядит следующим образом:

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

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

Просто один файл bash, который вы можете вставить в свой PATH где-нибудь и запустить - кажется, работает для меня, и он не слишком старый.

Надеюсь, это кому-нибудь поможет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.