다음을 포함하는 파일 IP 파일이 있습니다.
$cat serverList
server 1 = 192.168.1.1
server 2 = 192.168.1.2
server 3 = 192.168.1.3
server 4 = 192.168.1.4
server 5 = 192.168.1.5
내 배쉬 코드:
serverList="/home/user1/nic-test/server-list"
for i in $(cat $serverList | awk '{print $3}'); do
s1=`ssh user1@$i /etc/sysconfig/ha/getactive.sh`
if [[ $s1 == "NodeType: Active" ]]
then
activenode=$i
standbynode=$server2
node1=$server3
node2=$server4
node3=$server5
fi
done
내 논리:
- 목록의 모든 서버 IP에 SSH를 통해 연결하고 활성 노드를 찾습니다. 목록의 노드가 활성화되면 해당 IP를 "activenode" 변수에 할당합니다.
내가 할 수 없는 일은 활성 노드 IP가 변수에 할당되면 activenode
파일의 다른 IP가 serverList
순서에 관계없이 다른 변수에 자동으로 할당되기를 원하는 것입니다.
standbynode=$server2
node1=$server3
node2=$server4
node3=$server5
답변1
첫째, awk
파일을 필요 없이 읽을 수 있습니다.cat
$NF
둘째, 세 번째 필드는 마지막 필드 에 사용되는 등호입니다.
셋째, 가장 중요한 것은 배열을 사용하면 이 작업이 훨씬 쉬워진다는 것입니다.
mapfile -t servers < <(awk '{print $NF}' serverlist)
declare -p servers
산출
declare -a servers=([0]="192.168.1.1" [1]="192.168.1.2" [2]="192.168.1.3" [3]="192.168.1.4" [4]="192.168.1.5")
그런 다음 귀하의 목표를 달성하기 위해 다음을 수행합니다.
#!/usr/bin/env bash
mapfile -t servers < <(awk '{print $NF}' serverlist)
for idx in "${!servers[@]}"; do
server=${servers[idx]}
s1=$(ssh user1@"$server" /etc/sysconfig/ha/getactive.sh)
if [[ $s1 == "NodeType: Active" ]]; then
activenode=$server
((standbyIdx = (idx + 1) % ${#servers[@]}))
standbynode=${servers[standbyIdx]}
unset 'servers[idx]' 'servers[standbyIdx]'
othernodes=( "${servers[@]}" )
break
fi
done
if [[ -z $activenode ]]; then
echo "No active nodes!"
exit 1
fi
declare -p activenode standbynode othernodes