Uložte a obnovte všechny balíčky
Na systémech založených na Debian/Ubuntu můžete seznam nainstalovaných balíčků uložit do souboru
dpkg --get-selections > my_package_list.txt
a znovu je nainstalujte spuštěním
apt-cache dumpavail | sudo dpkg --merge-avail
sudo dpkg --set-selections < my_package_list.txt
sudo apt-get dselect-upgrade
První řádek zajišťuje dpkg
Databáze uživatele je aktuální (dnes většina lidí používá apt
pro instalaci balíčků, které spravuje vlastní databázi), druhý řádek importuje vaše uložené výběry a třetí příkaz nainstaluje vybrané balíčky. Podrobnosti naleznete v příručce správce Debianu.
V případě, že jste nainstalovali balíčky z repozitářů třetích stran, musíte tyto repozitáře přidat před provedením výše uvedených kroků pro obnovení.
Ukládat a obnovovat pouze explicitně nainstalované balíčky
Aptitude automaticky instaluje závislosti (např. knihovnu vyžadovanou aplikací). Tyto balíčky jsou označeny jako "automatické" a mohou být automaticky odstraněny, když již nejsou vyžadovány. V případě, že chcete zachovat tyto "automatické" příznaky, nemůžeme použít dpkg
protože nesleduje automaticky nainstalované balíčky. Místo toho musíme použít trochu tajemnější
LC_ALL=C aptitude search -F '%p %C' '~i!~M' > my_package_list.txt
Toto prohledá všechny balíčky, které jsou nainstalovány (~i
) a nikoli (!
) označeno automaticky (~M
). Pro každý odpovídající balíček název balíčku (%p
) a stav (%C
) bude vytištěno (toto napodobuje výstup dpkg --get-selections
). LC_ALL=C
zajišťuje, že veškerý výstup bude proveden v angličtině bez překladu do rodného jazyka. Pro instalaci balíčků z tohoto seznamu použijte výše uvedené příkazy. Podrobnosti naleznete v uživatelské příručce aptitude.
Ansible je nástroj pro poskytování, správu konfigurace a nasazení aplikací s otevřeným zdrojovým kódem. Běží na mnoha systémech podobných Unixu a může konfigurovat systémy podobné Unixu i Microsoft Windows. Obsahuje svůj vlastní deklarativní jazyk pro popis konfigurace systému
(Z Wikipedie.) Domovská stránka (Github).
Ve stejné kategorii je několik dalších. Čtení o ansible by vám mělo poskytnout slovní zásobu, abyste mohli hledat ostatní a v případě potřeby porovnávat. Nix je novější uchazeč. Někdo říká "složitější, ale možná tak akorát.". na scéně je také šéfkuchař.
Vhodný příklad pro název hostitele myhost
, modul apt
(nahraďte yum
nebo cokoliv jiného):
ansible -K -i myhost, -m apt -a "name=tcpdump,tmux state=present" --become myhost
Seznam "tcpdump,tmux" může být rozšířen o čárky. (Skutečnost, že název hostitele myhost
je v příkazovém řádku dvakrát, protože nepoužíváme pevný seznam inventáře hostitelů, ale seznam ad-hoc s čárkou na konci.)
To pouze poškrábe povrch, Ansible má rozsáhlou sbírku modulů.
Pokud chcete pouze nainstalovat spoustu balíčků, jednoduchý jednořádkový program by mohl udělat jako:
sudo bash -c 'for package in "tmux" "htop" "gimp"; do apt install -y --no-upgrade "$package"; done'
Smyčka není nezbytně nutná, ale pokud bez ní apt nenajde některý z programů v seznamu, nepodaří se mu nainstalovat žádný z ostatních balíčků. To se může stát například tehdy, přejdete-li na novější verzi svého distra a starší balíčky již nejsou v repozitářích. Pokud dáváte přednost všemu nebo ničemu, použijte
sudo apt install -y --no-upgrade tmux htop gimp
Pokud chcete také uložit své konfigurace, hledaný výraz by byl "dotfiles". Tak se nazývají konfigurace v systémech podobných Unixu, protože většinou začínají ".".
Rychlý a špinavý způsob, jak je uložit, je zkopírovat všechny tyto konfigurační adresáře do vašeho nového systému. Lepším způsobem by bylo umístit je pod správu verzí pomocí nástrojů jako git. K nastavení systému používám kombinaci git, dotbot a ručně psaných skriptů.
Aktualizovat
Jeden bod, který v diskuzi zatím chybí, je apt
obvykle není jediným systémem pro správu balíčků, který člověk potřebuje pro cokoli nad rámec holých základů. Další nástroje pro správu balíčků mohou být snap
, pip
, conda
, cargo
a mnoho dalších. To je implicitně řešeno v odpovědi Alexe Stragiese. Ansible
obsahuje obrovské množství modulů včetně modulů pro správu balíčků kromě apt
jako snap
a pip
.Jelikož moje odpověď je zaměřena na psaní vlastního skriptu, rád bych to rozšířil. Dobře otestovaný rámec, jako je Ansible
by měl být obecně preferován pro většinu úkolů, ale vlastnoručně psaný kód v mých očích poskytuje výhodu ve smyslu flexibility.
Malý příklad rámce
Napsal jsem malý kód v pythonu, který bude ilustrovat, jak by takový rámec mohl vypadat.
#!/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()
Základními složkami jsou funkce pro zpracování seznamu balíčků oddělených novými řádky (read_package_list
) a funkci pro spuštění příkazu instalačního programu v shellu (install_packages
.Řádky pouze s mezerami a řádky začínající #
jsou při čtení v seznamu balíčků ignorovány. main
zpracovává argumenty, které lze zadat na příkazovém řádku jako installer command
, packagefile
, errorlog
.
Co mi to dává?
Můžete použít libovolný instalační příkaz
./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
To může být užitečné, pokud si vedete seznam balíčků, se kterými by se mělo zacházet stejně. Jakmile takový rámec existuje, je snadné jej vylepšit. Dalo by se například upravit způsob protokolování instalačního procesu nebo přizpůsobit zpracování argumentů příkazového řádku. Dalším aspektem je, že skript by pravděpodobně neměl provádět každý příkaz jako root (pokud je spouštěn jako root), jak to aktuálně dělá.