複数サーバーでシェルコマンドを実行する方法メモ
はじめに
サーバー数が多いサービスでの作業
各サーバーで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
スクリプトとかほとんど書いたことないからおかしいかもしれないけど・・・
以上です