修正する

修正する

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

編集:すべての答えに感謝します!私はAnsibleを選択しました。素晴らしいツールです。

答え1

すべてのパッケージの保存と復元

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

最初の行はdpkgデータベースが最新であることを確認し(最近、ほとんどの人はapt独自のデータベースをインストールして維持するパッケージを使用します)、2行目は保存された選択を取得し、3番目のコマンドは選択したパッケージをインストールします。よりDebian 管理者マニュアルもっと学ぶ。

サードパーティのリポジトリからパッケージをインストールした場合は、上記のリカバリ手順を実行する前にそのリポジトリを追加する必要があります。

明示的にインストールされたパッケージのみの保存と復元

資格依存関係(アプリケーションに必要なライブラリなど)を自動的にインストールします。これらのパッケージは「自動」と表示され、不要になったときに自動的に削除できます。これらの「auto」フラグを維持したい場合は、dpkg自動的にインストールされたパッケージを追跡しないため、使用できません。代わりに、私たちは少し秘密の表現を使うべきです。

LC_ALL=C aptitude search -F '%p %C' '~i!~M' > my_package_list.txt

自動()でマークされていない()インストールされているすべての(~i)パッケージを検索します。一致する各パッケージに対して、パッケージ名()とステータス()が印刷されます(これは出力に似ています)。すべての出力が英語で行われ、母国語に翻訳する必要がないことを確認してください。上記のコマンドを使用して、このリストにパッケージをインストールします。より!~M%p%Cdpkg --get-selectionsLC_ALL=C適性使用説明書もっと学ぶ。

答え2

Ansibleは、オープンソースソフトウェアの構成、構成管理、およびアプリケーション配備ツールです。これは多くのUnixシリーズシステムで実行され、Microsoft WindowsだけでなくUnixシリーズシステムでも構成できます。システム構成を記述する独自の宣言言語が含まれています。

(からウィキペディア.)ホームページ(Github)

同じカテゴリには他にもいくつかあります。 ~について読む他のコンテンツを検索し、必要に応じて比較できる語彙を提供する必要があります。ニックス新しい競争相手です。何人かの人々は「もっと複雑ですが、たぶんぴったり合うかもしれません」と言います。現場でも。

myhostホスト名、モジュールの可能な例apt(または他のものに置き換えますyum):

ansible -K -i myhost, -m apt -a "name=tcpdump,tmux state=present" --become myhost

「tcpdump、tmux」リストはコンマを使用して拡張できます。 (実際には、myhost固定ホストインベントリリストを使用せず、最後にコンマ付きの一時ホストインベントリリストを使用するため、コマンドラインにホスト名が2回表示されます。)

これは単に表面を傷つけるだけです。Ansibleには幅広いモジュールコレクションがあります。

答え3

複数のパッケージをインストールする場合は、単純なコード行を使用してください。

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、手書きのスクリプトを組み合わせて使用​​してシステムを設定します。

修正する

これまでの議論で見落とされたのは、これがapt最も基本的な機能異常を実行するために必要な唯一のパッケージ管理システムではないことが多いことです。他のパッケージ管理ツールにはsnap、、などが含まれます。これはAlex Stragiesの答えで暗黙的に解決されました。また、パッケージ管理モジュールを含む多くのモジュールが含まれています。私の答えは独自のスクリプトを書くことに焦点を当てているので、これについてもっと説明したいと思います。よくテストされたフレームワークは一般的にほとんどの作業に好まれますが、私の考えでは、独自のコードは柔軟性の点で利点があります。pipcondacargoAnsibleaptsnappipAnsible

小さな例のフレームワーク

私はそのようなフレームワークがどのように見えるかについての例を提供する小さなコードを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として実行されている場合)。

答え4

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

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

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

関連情報