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

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

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

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

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

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

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

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

5 ответов

Решение

На эталонной установке (только один раз):

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)

На старом сервере запустите:

dpkg --get-selection> старый список пакетов

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

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

apt-get update

dselect update

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

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

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

Затем вы можете получить различия, используя:

     diff -Nur old_file new_file > changes.txt

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

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

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

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

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

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

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

Другие вопросы по тегам