Guardar y restaurar todos los paquetes
En los sistemas basados en Debian/Ubuntu, puede volcar la lista de paquetes instalados en un archivo
dpkg --get-selections > my_package_list.txt
e instálelos de nuevo ejecutando
apt-cache dumpavail | sudo dpkg --merge-avail
sudo dpkg --set-selections < my_package_list.txt
sudo apt-get dselect-upgrade
La primera línea asegura dpkg
La base de datos de está actualizada (hoy en día la mayoría de la gente usa apt
para instalar paquetes que mantienen su propia base de datos), la segunda línea importa sus selecciones guardadas y el tercer comando instala los paquetes seleccionados. Consulte el Manual del administrador de Debian para obtener más información.
En caso de que haya instalado paquetes de repositorios de terceros, debe agregar estos repositorios antes de seguir los pasos anteriores para la restauración.
Guardar y restaurar solo paquetes instalados explícitamente
Aptitude instala automáticamente las dependencias (por ejemplo, una biblioteca requerida por una aplicación). Estos paquetes están marcados como "automáticos" y se pueden eliminar automáticamente cuando ya no se necesitan. En caso de que quiera conservar estas banderas "automáticas", no podemos usar dpkg
ya que no rastrea los paquetes instalados automáticamente. En su lugar, tenemos que usar el algo más críptico
LC_ALL=C aptitude search -F '%p %C' '~i!~M' > my_package_list.txt
Esto buscará todos los paquetes que están instalados (~i
) y no (!
) marcado automático (~M
). Para cada paquete coincidente, el nombre del paquete (%p
) y el estado (%C
) se imprimirá (esto imita la salida de dpkg --get-selections
). LC_ALL=C
asegura que toda la producción se realice en inglés sin traducción a un idioma nativo. Use los comandos mencionados anteriormente para instalar los paquetes de esta lista. Consulte el manual del usuario de aptitude para obtener más detalles.
Ansible es una herramienta de implementación de aplicaciones, gestión de configuración y aprovisionamiento de software de código abierto. Se ejecuta en muchos sistemas similares a Unix y puede configurar tanto sistemas similares a Unix como Microsoft Windows. Incluye su propio lenguaje declarativo para describir la configuración del sistema
(De Wikipedia.) Página de inicio (Github).
Hay varios otros en la misma categoría. Leer sobre ansible debería darle vocabulario para buscar los demás y comparar, si es necesario. Nix es un contendiente más nuevo. Algunos dicen "más complejo, pero tal vez lo correcto". el chef también está en la escena.
Ejemplo de Ansible para el nombre de host myhost
, módulo apt
(reemplazar con yum
o lo que sea):
ansible -K -i myhost, -m apt -a "name=tcpdump,tmux state=present" --become myhost
La lista "tcpdump,tmux" se puede ampliar con comas. (El hecho de que el nombre de host myhost
es dos veces en la línea de comandos, porque no estamos usando una lista de inventario de host fija, sino una ad-hoc, con la coma final).
Esto solo toca la superficie, Ansible tiene una extensa colección de módulos.
Si solo desea instalar un montón de paquetes, una sola línea podría ser como:
sudo bash -c 'for package in "tmux" "htop" "gimp"; do apt install -y --no-upgrade "$package"; done'
El bucle no es estrictamente necesario, pero sin él, si apt no encuentra ninguno de los programas en la lista, no podrá instalar ninguno de los otros paquetes. Esto puede suceder, por ejemplo, si cambia a una versión más reciente de su distribución y los paquetes más antiguos ya no están dentro de los repositorios. Si prefiere todo o nada use
sudo apt install -y --no-upgrade tmux htop gimp
Si también desea guardar sus configuraciones, el término de búsqueda sería "dotfiles". Así se llaman las configuraciones en los sistemas similares a Unix, ya que en su mayoría comienzan con un ".".
Una forma rápida y sucia de guardarlos es simplemente copiando todos esos directorios de configuraciones a su nuevo sistema. Una mejor manera sería colocarlos bajo el control de versiones con herramientas como git. Utilizo una combinación de git, dotbot y scripts escritos a mano para configurar mi sistema.
Actualizar
Un punto que falta en la discusión hasta ahora es que apt
normalmente no es el único sistema de administración de paquetes que uno necesita para algo más allá de lo básico. Otras herramientas de administración de paquetes pueden ser snap
, pip
, conda
, cargo
y muchos más. Esto se aborda implícitamente en la respuesta de Alex Stragies. Ansible
contiene una gran cantidad de módulos, incluidos módulos para administrar paquetes además de apt
como snap
y pip
.Como mi respuesta se centra en escribir su propio script, me gustaría ampliarlo. Un marco bien probado como Ansible
en general, debería preferirse para la mayoría de las tareas, pero el código escrito por uno mismo ofrece una ventaja en términos de flexibilidad en mi opinión.
Pequeño marco de ejemplo
He escrito un pequeño código en python que ejemplificará cómo podría verse dicho marco.
#!/usr/bin/env python3
import os
import re
import sys
import subprocess
def read_package_list(path):
package_list=[]
try:
with open(os.path.realpath(path)) as f:
for line in f:
match = re.search(r'^(?!\s*$)(?!#)\w+',line)
if match:
package_list.append(match.group(0))
return package_list
except Exception as e:
print(e.message)
print(e.args)
sys.exit(1)
return package_list
def install_packages(command,package_list,err_log):
try:
with open(err_log,'w+') as f:
for p in package_list:
print('executing '+command+' '+str(p))
out=subprocess.run(command+' '+p,shell=True,stderr=f)
except Exception as e:
print(e.message)
print(e.args)
sys.exit(1)
def main():
args = sys.argv[1:]
package_list = read_package_list(args[1])
err_log=os.path.realpath(args[2])
install_packages(args[0],package_list,err_log)
if __name__ == '__main__':
main()
Los ingredientes básicos son una función para procesar una lista de paquetes separados por saltos de línea (read_package_list
) y una función para ejecutar el comando del instalador en un shell (install_packages
). Líneas con solo espacios en blanco y líneas que comienzan con #
se ignoran cuando se leen en la lista de paquetes. El main
procesa los argumentos que se pueden dar en la línea de comando como installer command
, packagefile
, errorlog
.
¿Qué me da eso?
Bueno, puedes usar cualquier comando de instalación que quieras
./installerscript.py 'apt install --dry-run' myaptpackages.txt apt_err.log
./installerscript.py 'snap install' mysnaps.txt snap_err.log
./installerscript.py 'pip install --user' mypy.txt py_err.log
./installerscript.py 'git clone' repos.txt git_err.log
Esto podría ser útil si uno mantiene una lista de paquetes que deben tratarse de la misma manera. Una vez que existe dicho marco, es fácil mejorarlo. Uno podría, por ejemplo, personalizar la forma en que se registra el proceso de instalación o personalizar el procesamiento de los argumentos de la línea de comandos. Otro aspecto es que el script probablemente no debería ejecutar cada comando como root (si se ejecuta como root) como lo hace actualmente.