多くのサーバーでSSHを介したコマンド実行の自動化

多くのサーバーでSSHを介したコマンド実行の自動化

.txt ファイルには IP アドレスのリストがあります。例:

1.1.1.1
2.2.2.2
3.3.3.3

各IPアドレスの後にはサーバーがあり、各サーバーのポート22で実行されるSSHDがあります。すべてのサーバーがリストにあるわけではありませんknown_hosts(私のPCではUbuntu 10.04 LTS / bash)。

これらのサーバーでコマンドを実行して出力を収集するにはどうすればよいですか?

理想的には、すべてのサーバーでコマンドを並列に実行したいと思います。

すべてのサーバーで公開鍵認証を使用します。

以下はいくつかの潜在的な落とし穴です。

  • ssh は、指定されたサーバー SSH キーを自分のknown_hostsファイルに入れるように求めます。
  • 指定されたコマンドは、出力が無効である可能性があることを示すゼロ以外の終了コードを返すことがあります。私はこれを実現しなければならない。
  • たとえば、ネットワーク障害により特定のサーバーへの接続が確立されない場合があります。
  • コマンドの実行に予想以上に時間がかかる場合、またはコマンドの実行中にサーバーにエラーが発生した場合は、タイムアウトが必要です。

サーバーはAIX / kshです(しかしそれは重要ではないと思います)。

答え1

複数のコンピュータに同時にログインし、複数のコンピュータで一連のコマンドを実行できるツールがいくつかあります。以下はいくつかあります。

答え2

好きならPythonスクリプトは bashスクリプト以上です。構造あなたに適したツールかもしれません。

~からファブリックホームページ:

Fabric は、アプリケーションのデプロイやシステム管理作業のための SSH の使用を簡素化するように設計された Python (2.5 以降) ライブラリであり、コマンドラインツールです。

これは、ローカルまたはリモートのシェルコマンド(通常またはsudoを介して)を実行し、ファイルをアップロード/ダウンロードするための基本的な作業セットだけでなく、ユーザー入力メッセージの表示や中断などの補助機能も提供します。

一般的な用途には、1つ以上の機能を含むPythonモジュールを作成し、fabコマンドラインツールを介して実行することが含まれます。

答え3

psshや他のソフトウェアをインストールできないと仮定すると、次のことができます。

tmpdir=${TMPDIR:-/tmp}/pssh.$$
mkdir -p $tmpdir
count=0
while IFS= read -r userhost; do
    ssh -n -o BatchMode=yes ${userhost} 'uname -a' > ${tmpdir}/${userhost} 2>&1 &
    count=`expr $count + 1`
done < userhost.lst
while [ $count -gt 0 ]; do
    wait $pids
    count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"

答え4

非常に基本的な設定:

for host in $(cat hosts.txt); do ssh "$host" "$command" >"output.$host"; done

認証に名前/パスワードを使用することは本当に良い考えではありません。これには秘密鍵を設定する必要があります。

ssh-keygen && for host in $(cat hosts.txt); do ssh-copy-id $host; done

関連情報