以下を含むファイル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
次に、3番目のフィールドは最後のフィールドに使用される等号です。
第三に、最も重要なことは、配列を使用するとこれがはるかに簡単になるということです。
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