接続できないサーバーにアクセスしようとしたときにSSHタイムアウトをすばやく設定する

接続できないサーバーにアクセスしようとしたときにSSHタイムアウトをすばやく設定する

私たちの環境のすべてのサーバーを終了するスクリプトを書いた。ただし、一部のサーバーに最初から接続できない場合やサーバーがダウンした場合、スクリプトは中断され、何も起こりません。一部のサーバーに接続できない場合はどうすればよいですか?

#!/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

関連情報