Calcule una lista de diferencias entre los paquetes instalados en dos hosts

11

Solo agrego algunos problemas con mis servidores virtuales Debian y agrego para reinstalarlos desde cero. Sin embargo, todavía tenía acceso a la versión anterior y podía recuperar la lista de paquetes instalados.

Para facilitar el proceso de restauración de un servidor virtual en el futuro, me gustaría crear una lista de paquetes específicos para cada uno de mis servidores.

Para explicar mejor lo que quiero lograr. Ya tengo un proceso automatizado para crear un nuevo servidor virtual con algún paquete básico y configuración utilizada en todas partes. Ahora quiero guardar el delta con este "esqueleto" para facilitar la reinstalación de un servidor en particular.

Una verdadera ventaja será también guardar los archivos de configuración modificados de forma predeterminada, pero puedo vivir solo con la lista de paquetes.

En resumen, quiero una forma de crear una lista de paquetes instalados en un host pero no en otro.

Será realmente genial si la lista contiene solo paquetes instalados manualmente y no la lista de todas las dependencias.

Si tiene algunas herramientas existentes que están diseñadas para lograr esta tarea en particular, no dude en proponerlas, pero quiero mantener la dependencia lo más pequeña posible. Para información, no son exactamente servidores virtuales, sino contenedores LXC.

krtek
fuente
Solo un pensamiento, pero podría ser hora de comenzar a trabajar en esto desde la dirección opuesta. En lugar de intentar extraer la información, por qué configurar un sistema de gestión de configuración (títere). Luego envíe las cosas a sus sistemas administrados.
Zoredache
Oh, por cierto, ve esta pregunta. serverfault.com/questions/3852/…
Zoredache
@Zoredache Actualmente estoy buscando una mejor manera de administrar todo esto, pero mientras tanto quería encontrar una forma rápida de guardar el estado de los servidores por si acaso. Gracias por el enlace !
krtek

Respuestas:

12

En la instalación de referencia (solo una vez):

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

(Lo siguiente asume bash)

Para agregar los paquetes desde la instalación de referencia (esto no muestra lo que se eliminó):

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

Aún mejor, evitando la copia de baselist.txt:

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

en el servidor anterior, ejecute:

dpkg --get-selections> lista de paquetes antiguos

copie el archivo anterior al nuevo servidor y ejecútelo en el nuevo servidor:

dpkg --set-selections <lista-paquetes-antiguos

apt-get update

actualización dselect

Además, recuerde agregar todos los repositorios adicionales del /etc/apt/sources.listservidor anterior al servidor nuevo, antes de esta migración de paquetes, como si no lo hiciera, entonces la mayoría de los paquetes quedarán sin instalar.

Farhan
fuente
Esto guardará la lista completa de paquetes, y es exactamente la solución que utilicé para restaurar los servidores. Pero ahora, para facilitar el proceso en el futuro, solo quiero guardar la lista de paquetes que es diferente del servidor base.
krtek
1
ok, eso también es muy fácil. Primero haga una copia de seguridad de la lista del servidor anterior con "dpkg --get-selections> old-packages-list", luego obtenga la lista de paquetes en el nuevo servidor con "dpkg --get-selections > new-packages-list ",,, ejecute este comando" cat old-packages-list | awk '{print $ 1}'> old-list ",,, mismo comando en el nuevo servidor, pero reemplace old con new. ejecute un diff en ambos archivos, lo que le mostrará la diferencia. por diff -w old-list new-list
Farhan
1
cut -f1probablemente será más rápido que awk, y como se comentó en la respuesta de Khaled, diff no siempre devuelve un resultado correcto. La solución con commrealmente por favor por ahora ... Sin embargo, me falta una versión que enumera solo los paquetes instalados manualmente.
krtek
1

Puede usar el siguiente comando para obtener la lista completa de paquetes en ambos servidores:

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

Luego, puede obtener las diferencias usando:

     diff -Nur old_file new_file > changes.txt

Puede filtrar los cambios necesarios usando grep. Además, diff se puede utilizar para obtener los cambios en los archivos de configuración y generar parches para aplicarlos cuando sea necesario. Por cierto, diff puede comparar dos carpetas, no solo dos archivos.

Khaled
fuente
El problema con la salida diff es que no se puede alimentar directamente a apt-get para reinstalar todo de manera automática ... Y como Shellholic propuesto, usar comm es mejor en este caso particular, diff podría proporcionar resultados incorrectos si el La lista de paquetes es realmente larga.
krtek
Otro problema es que dpkg dimensiona automáticamente la columna de salida. Entonces, un dpkg -l de un servidor con un nombre de paquete más largo dificulta la diferencia.
Paolo
1

Blueprint está diseñado exactamente para sus necesidades. Escupe una descripción de paquetes instalados y archivos de configuración que han sido modificados. Es capaz de convertir estas descripciones en scripts de Puppet o Chef para aplicarlos a cuadros limpios.

Ben Butler-Cole
fuente
0

También encontré este útil paquete, cuya descripción es la siguiente:

Un script Bash que compara el árbol del sistema de archivos de un paquete Debian con el árbol del sistema de archivos actual, imprimiendo diferencias unificadas para archivos que difieren.

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

Solo un solo archivo bash que puede pegar en su RUTA en algún lugar y ejecutar, parece funcionar para mí y no es demasiado viejo.

Espero que esto ayude a alguien.

smaudet
fuente