Enregistrer et restaurer tous les packages
Sur les systèmes basés sur Debian/Ubuntu, vous pouvez vider la liste des packages installés dans un fichier
dpkg --get-selections > my_package_list.txt
et réinstallez-les en exécutant
apt-cache dumpavail | sudo dpkg --merge-avail
sudo dpkg --set-selections < my_package_list.txt
sudo apt-get dselect-upgrade
La première ligne assure dpkg
la base de données de est à jour (aujourd'hui la plupart des gens utilisent apt
pour installer des packages qui maintiennent sa propre base de données), la deuxième ligne importe vos sélections enregistrées et la troisième commande installe les packages sélectionnés. Consultez le manuel de l'administrateur Debian pour plus de détails.
Si vous avez installé des packages à partir de référentiels tiers, vous devez ajouter ces référentiels avant de suivre les étapes ci-dessus pour la restauration.
Enregistrer et restaurer uniquement les packages explicitement installés
Aptitude installe automatiquement les dépendances (par exemple une bibliothèque requise par une application). Ces packages sont marqués comme "automatiques" et peuvent être automatiquement supprimés lorsqu'ils ne sont plus nécessaires. Si vous souhaitez conserver ces drapeaux "automatiques", nous ne pouvons pas utiliser dpkg
car il ne suit pas les packages installés automatiquement. Au lieu de cela, nous devons utiliser le légèrement plus cryptique
LC_ALL=C aptitude search -F '%p %C' '~i!~M' > my_package_list.txt
Cela recherchera tous les packages installés (~i
) et non (!
) marqué automatique (~M
). Pour chaque package correspondant, le nom du package (%p
) et le statut (%C
) sera imprimé (cela imite la sortie de dpkg --get-selections
). LC_ALL=C
garantit que toutes les sorties sont effectuées en anglais sans traduction dans une langue maternelle. Utilisez les commandes mentionnées ci-dessus pour installer les packages de cette liste. Reportez-vous au manuel de l'utilisateur d'aptitude pour plus de détails.
Ansible est un outil de provisionnement de logiciels open source, de gestion de la configuration et de déploiement d'applications. Il fonctionne sur de nombreux systèmes de type Unix et peut configurer à la fois des systèmes de type Unix et Microsoft Windows. Il inclut son propre langage déclaratif pour décrire la configuration du système
(De Wikipedia.) Page d'accueil (Github).
Il y en a plusieurs autres dans la même catégorie. La lecture d'ansible devrait vous donner du vocabulaire pour rechercher les autres et comparer, si nécessaire. Nix est un nouveau concurrent. Certains disent "plus complexe, mais peut-être juste.". le chef est également sur la scène.
Exemple ansible pour le nom d'hôte myhost
, module apt
(remplacer par yum
ou autre):
ansible -K -i myhost, -m apt -a "name=tcpdump,tmux state=present" --become myhost
La liste "tcpdump,tmux" peut être étendue avec des virgules. (Le fait que le nom d'hôte myhost
est deux fois dans la ligne de commande, car nous n'utilisons pas une liste d'inventaire d'hôtes fixe, mais une liste ad hoc, avec la virgule de fin.)
Cela ne fait qu'effleurer la surface, Ansible possède une vaste collection de modules.
Si vous souhaitez simplement installer un tas de packages, un simple one-liner pourrait faire comme :
sudo bash -c 'for package in "tmux" "htop" "gimp"; do apt install -y --no-upgrade "$package"; done'
La boucle n'est pas strictement nécessaire, mais sans elle, si apt ne parvient pas à trouver l'un des programmes de la liste, il ne pourra installer aucun des autres packages. Cela peut arriver par exemple si vous passez à une version plus récente de votre distribution et que les anciens packages ne sont plus dans les repos. Si vous préférez tout ou rien, utilisez
sudo apt install -y --no-upgrade tmux htop gimp
Si vous souhaitez également enregistrer vos configurations, le terme de recherche serait "dotfiles". C'est ainsi que s'appellent les configurations dans les systèmes de type Unix, car elles commencent généralement par un ".".
Un moyen rapide et sale de les enregistrer consiste simplement à copier tous ces répertoires de configurations sur votre nouveau système. Une meilleure façon serait de les placer sous contrôle de version avec des outils comme git. J'utilise une combinaison de scripts git, dotbot et écrits à la main pour configurer mon système.
Mettre à jour
Un point qui manque à la discussion jusqu'à présent est que apt
n'est généralement pas le seul système de gestion de paquets dont on a besoin pour quoi que ce soit au-delà des bases. D'autres outils de gestion de paquets peuvent être snap
, pip
, conda
, cargo
et bien d'autres. Ceci est implicitement abordé dans la réponse d'Alex Stragies. Ansible
contient une grande quantité de modules, y compris des modules pour gérer les packages en dehors de apt
comme snap
et pip
.Comme ma réponse est axée sur l'écriture de votre propre script, j'aimerais développer cela.Un cadre bien testé tel que Ansible
devrait généralement être préféré pour la plupart des tâches, mais le code auto-écrit donne un avantage en termes de flexibilité à mes yeux.
Petit exemple de framework
J'ai écrit un petit code en python qui illustrera à quoi pourrait ressembler un tel framework.
#!/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()
Les ingrédients de base sont une fonction pour traiter une liste de paquets séparés par des retours à la ligne (read_package_list
) et une fonction pour exécuter la commande d'installation dans un shell (install_packages
).Lignes avec uniquement des espaces et lignes commençant par #
sont ignorés lors de la lecture dans la liste des paquets. Les main
traite les arguments qui peuvent être donnés sur la ligne de commande comme installer command
, packagefile
, errorlog
.
Qu'est-ce que cela me donne ?
Eh bien, vous pouvez simplement utiliser n'importe quelle commande d'installation que vous aimez
./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
Cela peut être utile si l'on conserve une liste de packages qui doivent tous être traités de la même manière. Une fois qu'un tel framework existe, il est facile de l'améliorer. On pourrait, par exemple, personnaliser la façon dont le processus d'installation est enregistré ou personnaliser le traitement des arguments de la ligne de commande. Un autre aspect est que le script ne devrait probablement pas exécuter chaque commande en tant que root (s'il est exécuté en tant que root) comme il le fait actuellement.