読者です 読者をやめる 読者になる 読者になる

複数サーバーでシェルコマンドを実行する方法メモ

はじめに

サーバー数が多いサービスでの作業
各サーバーで1台ずつコマンドを実行するのが面倒になってきたのでスクリプト作ってみた

実装〜対話形式

server.txt

xxx.yyy.zzz.1
xxx.yyy.zzz.2
・・・

rshell.sh

#!/bin/bash                                                                                                                                                                                                        

cmd_cnf=""
cmd_exec=""

echo "実行するコマンドを入力してください[.で実行]:"
while read line
do
    if [ "$line" = "." ]; then
        break
    fi
    cmd_cnf=$cmd_cnf$line"\n"
    cmd_exec=$cmd_exec$line";"
done

echo "-----------------------------------------------"
echo "実行コマンド"
echo "-----------------------------------------------"
echo -e "$cmd_cnf"

SERVER_LIST=./server.txt
while read server
do
    echo "-----------------------------------------------"
    echo $server
    echo "-----------------------------------------------"
    ssh -n $server "$cmd_exec"
    echo ""
done < $SERVER_LIST

実行結果

[user@host ~]$ ./rexec.sh 
実行するコマンドを入力してください[.で実行]:
cd ~/logs
ls
.
-----------------------------------------------
実行コマンド
-----------------------------------------------
cd ~/logs
ls

-----------------------------------------------
xxx.yyy.zzz.1
-----------------------------------------------
20160401.log
20160402.log

-----------------------------------------------
xxx.yyy.zzz.2
-----------------------------------------------
20160401.log
20160402.log

実装〜外部ファイル実行

ls.sh

#!/bin/bash                                                                                                                                                                                                        

cd ~/logs
ls -ltr

rshell_file.sh

#!/bin/bash                                                                                                                                                                                                        

if [ $# -ne 1 ] || [ ! -e $1 ] ; then
    echo "シェルファイルを正しく指定してください"
    exit
fi

SERVER_LIST=./server.txt
while read server
do
    cmd=$1
    echo "-----------------------------------------------"
    echo $server
    echo "-----------------------------------------------"
    ssh $server 'sh ' < $1

done < $SERVER_LIST

実行結果

[user@host ~]$ ./rshell.sh ./ls.sh

-----------------------------------------------
xxx.yyy.zzz.1
-----------------------------------------------
20160401.log
20160402.log

-----------------------------------------------
xxx.yyy.zzz.2
-----------------------------------------------
20160401.log
20160402.log

スクリプトとかほとんど書いたことないからおかしいかもしれないけど・・・

以上です