우리 환경의 모든 서버를 종료하는 스크립트를 작성했습니다. 그러나 일부 서버에 처음부터 연결할 수 없거나 서버가 다운되면 스크립트가 중단되고 아무 일도 일어나지 않습니다. 일부 서버에 연결할 수 없는 경우 어떻게 계속 진행하나요?
#!/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