Não sou especialista, mas fiz algo parecido. Não totalmente automático, mas envolve digitar apenas alguns comandos.
Primeiro, pegue a lista do que está em uso (supondo que todas as máquinas tenham o mesmo arco):
$ apt list --installed > install.list
Em seguida, traduza-o para o formato apt compreensível:
$ sed -r 's/ \[.*?\]//g' install.list | sed -r 's/(^.*?)\/.*?[ ](.*?)[ ](.*?)$/:=/g' > install.list.to.dl
Faça o download das versões atuais dos pacotes:
$ xargs apt download < install.list.to.dl
Isso fará o download de todos os debs que foram atualmente instalados no diretório atual.
Você precisaria criar um arquivo Packages.gz para adicionar esta pasta como fonte para o apt. Por exemplo,
$ cd ~/deb_server/debs/
$ dpkg-scanpackages -m . /dev/null | gzip -9c > Packages.gz
EDIT: o caminho para o dpkg-scanpackages deve ser relativo, caso contrário, isso irá interromper o processo de download mais tarde
(- m permite que você tenha várias versões, se você quiser a versão mais recente, remova-o)
Agora você precisa abrir um servidor de arquivos, por exemplo, apache2 e configurá-lo para indexar arquivos.
/etc/apache2/sites-enabled/000-debserver.conf
Contendo:
DocumentRoot /var/www
<Directory /var/www/>
Options +Indexes +FollowSymLinks
Require all granted
</Directory>
E finalmente você precisa criar um link simbólico da pasta deb para / var / www. (Ou configure o servidor para o local de download deb atual), por exemplo,
$ ln -s ~/deb_server/debs/ /var/www/repo
O último bit é adicionar a máquina do servidor como a única fonte para atualizações apt em cada máquina de destino.
$ deb [trusted=yes] http://deb_server_ip/repo /
Se você deseja atualizar os pacotes, você precisa re-executar o apt download da lista, mas sem a versão.
$ sed -r 's/ \[.*?\]//g' install.list | sed -r 's/(^.*?)\/.*?[ ](.*?)[ ](.*?)$/:/g' > install.list.for.update
$ apt update && xargs apt download < install.list.for.update
e atualize o Packages.gz.
Não tenho certeza se este é o melhor caminho, mas funciona para mim.