複数のサーバー上の引数からスクリプトを実行するにはどうすればよいですか?
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
答え2
私はこれを 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
できることはいくつかあります。
コマンドを並列で実行するか、シリアルで実行するかはわかりません。
シリアルで実行したい場合は、次のようにします。
- コマンドを実行するすべてのサーバーのリストを作成します。
- 走る:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done
コマンドを並列で実行したい場合は、CentOS/Ubuntu フレーバー OS の両方にインストールできる parallel-ssh ツールを使用できます。
必要に応じて、parallel-ssh コマンドをラップし、ユーザーがサーバーのリストとコマンドを指定できるようにするシェル スクリプトを作成しました。このスクリプトは、すべてのサーバーでコマンドを並列に発行します。
スクリプトは私のGithubで。
最後に提案したいのは、インベントリで Ansible を使用することです。