シェル スクリプトから複数のサーバーで選択コマンドを実行するにはどうすればよいですか?

シェル スクリプトから複数のサーバーで選択コマンドを実行するにはどうすればよいですか?

複数のサーバー上の引数からスクリプトを実行するにはどうすればよいですか?

evalコマンド リストを作成し、各サーバーでコマンドを実行しようとしています。各サーバーで正しく実行できる方法でコマンド リストを生成することができません。

$server_arrayこれまでのスクリプト全体は次のとおりです。基本的には、各サーバーにログインして、$script_arr 内のすべてのコマンド、または選択したコマンドのみを実行したいと思います。

#!/bin/bash

# run-commands.sh [optional script name]
# ex. run-commands.sh
# ex. run-commands.sh date_script
# ex. run-commands.sh hostname_script

# declare -a server_arr=("a.local" "b.local")
declare -a server_arr=("localhost")

if [ $# -eq 0 ]
  then
    # Default Processes
    declare -a script_arr=("date_script" "hostname_script")
else
    declare -a script_arr=($1)
fi

build_cmds()
{

    script_arr=("${@}")
    declare -a cmds

    for script_name in "${script_arr[@]}"
    do

        case "$script_name" in
            "date_script")
                cmds+='printf "executing date command\n; "'
                cmds+='date'
                cmds+='printf "date command executed\n; "'
            ;;
            "hostname_script")
                cmds+='printf "executing date command\n; "'
                cmds+='date'
                cmds+='printf "date command executed\n; "'
            ;;
        esac

    done

}

build_cmds "${script_arr[@]}"

for cmd in "${cmds[@]}"
do
    ssh user@$server_name -T 'eval "$cmd"'
done

echo "Completed executing all commands"

答え1

カピストラノmssh、 そしてクラスタこれらはすべて、複数のサーバーに同時にコマンドを発行できると主張するツールです。ご存知のとおり、これは非常に複雑な作業なので、車輪の再発明はしない方がよいでしょう。

答え2

私はこれを Puppet Bolt で行います。Puppet Bolt を使用すると、アドボカシー コマンドを簡単にリモートで実行できます。Puppet Bolt (無料) をダウンロードし、それを使用して、提供されたホストのリストでコマンドを発行するだけです。

Puppet Bolt 情報/ダウンロード

ボルトをインストールし、すべてのホストにSSHキーが設定されていることを確認してください。

答え3

1). 必要なすべてのコマンドとログへの出力リダイレクトを含むサーバー側スクリプトを作成します。たとえば、サーバー名とこのサーバーの空き容量を表示する「server-side.sh」です。

#! /bin/bash
cat /etc/hostname > log.txt
date > log.txt
df -h > log.txt

2). ローカル ワークステーションで実行する 2 番目のスクリプトを作成します。たとえば、スクリプトをサーバーに送信し、実行して結果ログを返す「run-server-side.sh」などです。

#! /bin/bash
SERVERS="server_1 server_2"

for ONE_SERVER in SERVERS
do
  scp server-side.sh $ONE_SERVER:path
  ssh $ONE_SERVER path/server-side.sh
  scp $ONE_SERVER:path/log.txt
  mv log.txt "log-$ONE_SERVER.txt"
done

ノート:サーバーは、キーによる認証で に設定する必要があります.ssh/config。例:

Host server_1
HostName address_1
User user_name_1

Host server_2
HostName address_2
User user_name_2

利点。

  • 追加のソフトウェアなしで、単に「ネイティブ」かつ「組み込み」の bash を使用します。
  • すべてのリモート サーバーには常に最新バージョンのスクリプトが存在します。
  • ローカル ワークステーションで、お気に入りのエディターを使用して、かなり複雑なスクリプトを作成および編集できます。

進化の場。

  • 大規模なサーバー側スクリプトは、いくつかの小さなスクリプトに分割すると便利です。1 つのタスク = 1 つのスクリプトとして、 経由でアップロードしますrsync
  • コンソールでの出力をきれいにするために、サーバーまたはタスクごとに異なる色を使用できます。http://misc.flogisoft.com/bash/tip_colors_and_formatting

答え4

できることはいくつかあります。

コマンドを並列で実行するか、シリアルで実行するかはわかりません。

シリアルで実行したい場合は、次のようにします。

  1. コマンドを実行するすべてのサーバーのリストを作成します。
  2. 走る:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done

コマンドを並列で実行したい場合は、CentOS/Ubuntu フレーバー OS の両方にインストールできる parallel-ssh ツールを使用できます。

必要に応じて、parallel-ssh コマンドをラップし、ユーザーがサーバーのリストとコマンドを指定できるようにするシェル スクリプトを作成しました。このスクリプトは、すべてのサーバーでコマンドを並列に発行します。

スクリプトは私のGithubで

最後に提案したいのは、インベントリで Ansible を使用することです。

関連情報