サーバーを複数運用していると、複数サーバーで同じコマンドを実行して結果を取得したい場合があります。 その場合、手動で各サーバーにsshでログインしてコマンドを実行すると、サーバー台数が多い場合に手間です。 ここでは、そのような場合に使用できるスクリプトについて説明します。
スクリプトは、以下の2つの機能を組み合わせたものになります。
注意 sshのログインは、鍵認証だけでログインできるようにすると、パスワード入力が無くなり、cronで自動実行することが可能となります。1個のファイルにまとめる
以下のように対象サーバーの定義と、コマンドを1つのスクリプトにまとめます。
#!/bin/bash # サーバー定義 HOSTS=( user@orange.example.com user@apple.exampl.com #コメント test@grape.example.com ) OUTPUT="$0.`date +%Y%m%d`.txt" #同じ日に何回実行しても最後の結果だけをファイルにする :> $OUTPUT for host in "${HOSTS[@]}" do echo $host >> $OUTPUT # SSHでログインしてコマンド実行 ssh $host 'df -h' >> $OUTPUT echo >> $OUTPUT done赤色の個所がサーバー定義と、実行コマンドになります。
実行すると、HOSTSの3サーバーでdfコマンドを実行して、その結果をファイルにします。
複数ファイルにする
対象サーバーは同じで、異なるタイミングで実行したい複数のコマンドがある場合、対象サーバーの定義ファイルと、実行コマンド用スクリプトを分けたほうが管理が楽になります。
ここでは、月末に実行するコマンドと、週一で実行するコマンドがあるケースを考えます。 その場合、以下のような3つのファイルに分けられます。
-
サーバー定義ファイル
-
コマンド実行用ファイル
サーバーを配列で定義しただけファイルhosts.sh のサンプルは以下のようになります。
#!/bin/bash HOSTS=( user@orange.example.com user@apple.exampl.com #コメント test@grape.example.com )
月末と週一で実行されるファイルの中身は以下のようになります。
#!/bin/bash # 対象サーバーの定義ファイルを読み込んで、変数HOSTSに配列で定義 . hosts.sh # 結果を保存するファイル名を指定 OUTPUT="$0.`date +%Y%m%d`.txt" :> $OUTPUT for host in "${HOSTS[@]}" do echo $host >> $OUTPUT # SSHでログインしてコマンド実行 ssh $host '[コマンド]' >> $OUTPU echo >> $OUTPUT done
こうすれば、対象サーバーが増えたり、減ったりしてもhosts.shだけの編集で対応できます。 また、各サーバーにスクリプトを置く必要が無いので、スクリプトの管理も楽になります。
#!/bin/bash # 対象サーバーの定義ファイルを読み込んで、変数HOSTSに配列で定義 . hosts.sh # 結果を保存するファイル名を指定 OUTPUT="$0.`date +%Y%m%d`.txt" :> $OUTPUT for host in "${HOSTS[@]}" do echo $host >> $OUTPUT ssh $host 'du -h -d0 /tmp' >> $OUTPUT ssh $host 'du -h -d1 /home' >> $OUTPUT echo >> $OUTPUT done