時々、Linuxシステム(主にUbuntuベースのディストリビューション)を再インストールする必要があります。私が必要とするすべてのソフトウェアを再インストールするプロセスは、本当に退屈で時間がかかります。私を助けることができるソフトウェアはありますか? WindowsにはNiniteがありますが、Linuxには他に何かありますか?
編集:すべての回答をありがとう!私はAnsibleを使いましたが、それは素晴らしいツールです。
Ansibleは、オープンソースのソフトウェアプロビジョニング、構成管理、アプリケーション導入ツールです。多くのUnixライクなシステムで実行され、UnixライクなシステムとMicrosoft Windowsの両方を構成できます。システム構成を説明する独自の宣言型言語が含まれています
( Wikipedia から) Homepage(Github) 。
同じカテゴリに他にもいくつかあります。 ansible について読むと、他の人を検索し、必要に応じて比較するための語彙が得られます。 Nix は新しい候補です。 「もっと複雑ですが、多分ちょうど良い」と言う人もいます。 chef も登場します。
ホスト名myhost
、モジュールapt
のAnsibleの例(yum
などに置き換えます):
ansible -K -i myhost, -m apt -a "name=tcpdump,tmux state=present" --become myhost
リスト "tcpdump、tmux"は、コンマで拡張できます。 (ホスト名myhost
がコマンドラインで2回使用されているというのは、固定のホストインベントリリストではなく、アドホックリストを使用しているためです。
これは表面を引っかくだけです Ansibleは広範なモジュールコレクションを持っています 。
Debian/Ubuntuベースのシステムでは、インストール済みパッケージのリストをファイルにダンプできます
dpkg --get-selections > my_package_list.txt
実行してそれらを再度インストールします
apt-cache dumpavail | Sudo dpkg --merge-avail
Sudo dpkg --set-selections < my_package_list.txt
Sudo apt-get dselect-upgrade
1行目はdpkg
のデータベースが最新であることを保証します(現在、ほとんどの人はapt
を使用して、独自のデータベースを保持するパッケージをインストールしています)、2行目は保存した選択をインポートし、3番目のコマンドは選択したものをインストールしますパッケージ。詳細は Debian Administrator's Handbook を参照してください。
サードパーティのリポジトリからパッケージをインストールした場合は、上記の復元手順を実行する前に、これらのリポジトリを追加する必要があります。
Aptitude は依存関係を自動的にインストールします(例:アプリケーションに必要なライブラリ)。これらのパッケージには「自動」のフラグが付けられ、不要になったときに自動的に削除できます。これらの「自動」フラグを保持したい場合は、自動的にインストールされたパッケージを追跡しないため、dpkg
を使用できません。代わりに、もう少し不可解なものを使用する必要があります
LC_ALL=C aptitude search -F '%p %C' '~i!~M' > my_package_list.txt
これにより、インストール済み(~i
)ではなく(!
)自動(~M
)のフラグが付けられたすべてのパッケージが検索されます。一致するパッケージごとに、パッケージ名(%p
)とステータス(%C
)が出力されます(これはdpkg --get-selections
の出力を模倣しています)。 LC_ALL=C
は、すべての出力が母国語に翻訳されることなく英語で行われることを保証します。上記のコマンドを使用して、このリストからパッケージをインストールします。詳細は aptitudeユーザーマニュアル を参照してください。
たくさんのパッケージをインストールしたいだけなら、シンプルなワンライナーは次のようになります:
Sudo bash -c 'for package in "tmux" "htop" "gimp"; do apt install -y --no-upgrade "$package"; done'
ループは厳密には必要ありませんが、ループがなければ、aptがリスト内のプログラムのいずれかを見つけられない場合、他のパッケージのインストールに失敗します。これは、たとえば、最新バージョンのディストリビューションに切り替え、古いパッケージがリポジトリ内に存在しない場合に発生する可能性があります。すべてまたは何も使用しない場合
Sudo apt install -y --no-upgrade tmux htop gimp
設定も保存したい場合、検索語は「dotfiles」になります。 Unixライクなシステムの設定は、ほとんどが「。」で始まるため、これが呼び出されます。
それらを保存するための迅速で汚れた方法は、すべての構成ディレクトリを新しいシステムにコピーすることです。より良い方法は、gitなどのツールを使用してバージョン管理下に置くことです。私はgit、dotbot、手書きのスクリプトを組み合わせてシステムをセットアップしています。
これまでの議論から欠落している1つの点は、apt
は通常、必要最低限の基本を超えて必要な唯一のパッケージ管理システムではないということです。他のパッケージ管理ツールには、snap
、pip
、conda
、cargo
などがあります。これは、Alex Stragiesの回答で暗黙的に扱われています。 Ansible
には、apt
やsnap
などのpip
以外のパッケージを管理するためのモジュールを含む、膨大な量のモジュールが含まれています。私の答えは自分で書くスクリプトに焦点を当てているので、それについて詳しく説明したいと思います。 Ansible
などの十分にテストされたフレームワークは、一般的にほとんどのタスクに推奨されますが、自己記述コードは、私の柔軟性の点で有利です。
私はpythonで小さなコードを書きました。これはそのようなフレームワークがどのように見えるかを例示するものです。
#!/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()
基本的な要素は、改行で区切られたパッケージのリストを処理する関数(read_package_list
)と、シェルでインストーラーコマンドを実行する関数(install_packages
)です。空白のみの行と#
で始まる行は、パッケージリストを読み取るときに無視されます。 main
は、コマンドラインでinstaller command
、packagefile
、errorlog
として指定できる引数を処理します。
まあ、あなたは好きなインストーラーコマンドを使うことができます
./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
これは、すべて同じ方法で処理する必要があるパッケージのリストを保持している場合に役立ちます。このようなフレームワークが存在すると、それを改善するのは簡単です。たとえば、インストールプロセスのログ記録方法をカスタマイズしたり、コマンドライン引数の処理をカスタマイズしたりできます。別の側面として、スクリプトはおそらく現在のように各コマンドをrootとして実行するべきではない(rootとして実行する場合).
コマンドラインからソフトウェアをインストールする場合は、
grep "^Sudo apt install" ~/.bash_history > system-setup.sh
システムのセットアップが完了すると、スクリプトが提供されます。スクリプトは(編集後)再利用して、次に必要になったときに新しくインストールされたシステムをセットアップできます。