Calcular uma lista de diferenças entre pacotes instalados em dois hosts

11

Acabei de adicionar alguns problemas com meus servidores virtuais Debian e para reinstalar todos eles do zero. No entanto, eu ainda tinha acesso à versão antiga e consegui recuperar a lista de pacotes instalados.

Para facilitar o processo de restauração de um servidor virtual no futuro, gostaria de criar uma lista de pacotes específicos para cada um dos meus servidores.

Para explicar melhor o que eu quero alcançar. Eu já tenho um processo automatizado para criar um novo servidor virtual com alguns pacotes e configurações básicos usados ​​em todos os lugares. Agora eu quero salvar o delta com esse "esqueleto" para facilitar a reinstalação de um servidor específico.

Uma vantagem real será também salvar os arquivos de configuração alterados do padrão, mas eu posso viver apenas com a lista de pacotes.

Em resumo, quero uma maneira de criar uma lista de pacotes instalados em um host, mas não em outro.

Será realmente ótimo se a lista contiver apenas pacotes instalados manualmente e não a lista de todas as dependências.

Se você possui algumas ferramentas existentes, projetadas para realizar essa tarefa específica, sinta-se à vontade para propô-las, mas quero manter a dependência o menor possível. Para obter informações, eles não são exatamente servidores virtuais, mas recipientes LXC.

krtek
fonte
Apenas um pensamento, mas talvez seja hora de começar a trabalhar nisso na direção oposta. Em vez de tentar extrair as informações, por que configurar um sistema de gerenciamento de configuração (fantoche). Em seguida, envie as coisas para seus sistemas gerenciados.
Zoredache
Oh, BTW, veja esta pergunta. serverfault.com/questions/3852/…
Zoredache 7/11
@ Zoredache Atualmente, estou procurando uma maneira melhor de gerenciar tudo isso, mas, enquanto isso, eu queria encontrar uma maneira rápida de salvar o estado dos servidores apenas por precaução. Obrigado pelo link !
krtek

Respostas:

12

Na instalação de referência (apenas uma vez):

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

(O seguinte pressupõe bash)

Para adicionar os pacotes da instalação de referência (isso não mostra o que foi removido):

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

Melhor ainda, evitando a cópia de baselist.txt:

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

no servidor antigo, execute:

dpkg --get-selections> lista-de-pacotes-antigos

copie o arquivo acima para o novo servidor e execute-o no novo servidor:

dpkg --set-selections <lista-de-pacotes-antigos

atualização apt-get

atualização dselect

Além disso, lembre-se de adicionar todos os repositórios extras do /etc/apt/sources.listservidor antigo para o novo servidor, antes dessa migração de pacotes, como se você não o fizer, e a maioria dos pacotes ficará desinstalada.

Farhan
fonte
Isso salvará toda a lista de pacotes e é exatamente a solução que usei para restaurar os servidores. Mas agora, para facilitar o processo no futuro, quero salvar apenas a lista de pacotes diferentes do servidor base.
krtek
11
ok, isso também é muito fácil., primeiro faça o backup da lista do servidor antigo por "dpkg --get-selections> old-packages-list" e, em seguida, obtenha a lista de pacotes no novo servidor por "dpkg --get-selections > new-packages-list ",,, execute este comando" cat old-packages-list | awk '{print $ 1}'> old-list ",,, mesmo comando no novo servidor, mas substitua o antigo pelo novo. execute um diff nos dois arquivos, o que mostrará a diferença. por diff -w old-list new-list
Farhan
11
cut -f1provavelmente será mais rápido que o awk e, como comentado na resposta de Khaled, o diff nem sempre retornará o resultado certo. A solução com commrealmente por favor por enquanto ... No entanto, estou faltando uma versão que lista apenas pacotes instalados manualmente.
krtek
1

Você pode usar o seguinte comando para obter a lista completa de pacotes nos dois servidores:

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

Em seguida, você pode obter as diferenças usando:

     diff -Nur old_file new_file > changes.txt

Você pode filtrar as alterações necessárias usando grep. Além disso, o diff pode ser usado para obter as alterações nos arquivos de configuração e gerar patches a serem aplicados quando necessário. A propósito, o diff pode comparar duas pastas e não apenas dois arquivos.

Khaled
fonte
O problema com a saída diff é que ele não pode ser alimentado diretamente para o apt-get reinstalar tudo de maneira automática ... E, como o Shellholic proposto, usar comm é melhor nesse caso específico, diff pode fornecer resultados errados se o lista de pacotes é realmente longa.
krtek
Outro problema é que o dpkg redimensiona automaticamente a coluna da saída. Portanto, um dpkg -l de um servidor com um nome de pacote mais longo dificulta as diferenças.
Paolo
1

O Blueprint foi projetado exatamente para sua necessidade. Ele cospe os pacotes de descrição instalados e os arquivos de configuração que foram alterados. É capaz de converter essas descrições em scripts Puppet ou Chef para aplicá-las em caixas limpas.

Ben Butler-Cole
fonte
0

Também encontrou este pacote útil, cuja descrição é a seguinte:

Um script Bash que compara a árvore do sistema de arquivos de um pacote Debian com a árvore atual do sistema de arquivos, imprimindo diferenças unificadas para arquivos que diferem.

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

Apenas um único arquivo bash que você pode colocar em seu PATH em algum lugar e executar - parece funcionar para mim e não é muito antigo.

Espero que isso ajude alguém.

smaudet
fonte