web-dev-qa-db-ja.com

新規インストール後にソフトウェアを再インストールするのに役立つソフトウェアはありますか

時々、Linuxシステム(主にUbuntuベースのディストリビューション)を再インストールする必要があります。私が必要とするすべてのソフトウェアを再インストールするプロセスは、本当に退屈で時間がかかります。私を助けることができるソフトウェアはありますか? WindowsにはNiniteがありますが、Linuxには他に何かありますか?

編集:すべての回答をありがとう!私はAnsibleを使いましたが、それは素晴らしいツールです。

19
Offpics

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は広範なモジュールコレクションを持っています

10
Alex Stragies

すべてのパッケージを保存して復元する

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ユーザーマニュアル を参照してください。

41
Martin Konrad

たくさんのパッケージをインストールしたいだけなら、シンプルなワンライナーは次のようになります:

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は通常、必要最低限​​の基本を超えて必要な唯一のパッケージ管理システムではないということです。他のパッケージ管理ツールには、snappipcondacargoなどがあります。これは、Alex Stragiesの回答で暗黙的に扱われています。 Ansibleには、aptsnapなどの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 commandpackagefileerrorlogとして指定できる引数を処理します。

それは私に何を与えますか?

まあ、あなたは好きなインストーラーコマンドを使うことができます

./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として実行する場合).

3
Max1

コマンドラインからソフトウェアをインストールする場合は、

grep "^Sudo apt install" ~/.bash_history > system-setup.sh

システムのセットアップが完了すると、スクリプトが提供されます。スクリプトは(編集後)再利用して、次に必要になったときに新しくインストールされたシステムをセットアップできます。

1