私たちの環境のすべてのサーバーを終了するスクリプトを書いた。ただし、一部のサーバーに最初から接続できない場合やサーバーがダウンした場合、スクリプトは中断され、何も起こりません。一部のサーバーに接続できない場合はどうすればよいですか?
#!/bin/bash
#script for Shutting down all VM & BM.
Region=$1
user=$2
region_file_path="/region/$Region.txt"
host=`cat $region_file_path`
key_path="/root/.ssh/id_rsa_adminpod"
for i in $host
do
# echo "Shutting down Host in $Region with ip addrss $i"
ssh -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null
if [ $? -ne 0 ]; then
echo "$i is shutdown!"
else
echo "There is some issue, try again"
exit 1
fi
done
答え1
最も簡単な解決策は、接続タイムアウトを適切な時間に設定することです。
ssh -o ConnectTimeout=10 -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null
10秒で十分です。
Ansibleなどの他のツールを使用してタスクを自動化することもできます。
答え2
Ansibleを使用したソリューションは次のとおりです。
0)管理対象ノードとシャットダウン対象ノード間のSSHパスワードなしアクセスが有効になっていることを確認してください。
1)終了する必要があるノードを含む単純なマニフェストファイルを準備します。サンプル内容があります:
[local]
localhost ansible_connection=local
[nodes]
192.168.1.30
192.168.1.40
2) ansible シェルモジュールを実行し、マニフェストファイルをパラメータおよび終了コマンドとして指定します。
ansible -i /tmp/hosts -m shell -a "/usr/sbin/shutdown +1" nodes
クローズは、接続がすぐに終了しないように1分の遅延を指定します。しかし、おそらくそうする必要はありません。
これは単なる例であり、複数のノードで並列に実行したい他のコマンドを使用できます。
答え3
「応答しない」依存関係がある場合は、その依存関係なしで接続を複数回exit 1
再試行できます。ssh
for i in $host
do
counter=0
while [ $counter -ne 3 ]; do
# echo "Shutting down Host in $Region with ip addrss $i"
ssh -o ConnectTimeout=10 -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null
if [ $? -ne 0 ]; then
echo "$i is shutdown!"
counter=3
else
echo "There is some issue, try again"
counter=$(($counter+1))
fi
done
done
答え4
「timeout」という基本的なbashコマンドがあるようです。https://man7.org/linux/man-pages/man1/timeout.1.html