2016-08-08 10 views
0

In HA-Konfiguration überprüfe ich regelmäßig auf VIP-Adresse auf eth0, (nennen wir es 2.2.2.2). Wenn es nach oben, dann brauche ich eine andere Gruppe von IP-Adresse für eth0 in/etc/network/interfaces Konfigurationsdatei zu öffnen:Bash Grep-Datei für Zeichenfolge und verwenden Sie jede als eine Variable in einem anderen Befehle

up ip addr add **1.2.3.34** dev $IFACE 
up ip addr add **1.2.3.40** dev $IFACE 
up ip addr add **1.2.3.48** dev $IFACE 

und jede IP-Pass nur auf eine andere Gruppe von Befehlen:

ip a a **1.2.3.34/32** dev eth0 
ip a a **1.2.3.40/32** dev eth0 
ip a a **1.2.3.48/32** dev eth0 

Was ich bisher getan ist:

#!/bin/bash 
STATUS=$(ip a s eth0 | grep inet | awk '{print $2}' | sed 's/addr://') 
if ip a s eth0 | grep inet | awk '{print $2}' | sed 's/addr://' | grep 2.2.2.2/27 ; then 
cat /etc/network/interfaces | grep -o "up ip addr add [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" > /tmp/ext_ip.txt 

Jetzt brauche ich Hilfe, wie jede Zeile oben (ip aa 1.2.3 ...) erwähnt auf einen anderen Befehl übergeben, haben aber keine Ahnung, wie um das richtig zu machen.

Optional möchte ich den Betrieb rückgängig machen, wenn VIP nicht im System vorhanden ist - falls der primäre HA-Host offline geht.

Antwort

0

Eine Möglichkeit, dies zu erreichen, wäre es, alle IP-Adressen in einem Array zu analysieren und verwenden, um eine Schleife for sie an die Schnittstelle zuzuweisen:

#!/bin/bash 

IFACE='eth0' 
VIP='192.168.0.1' 
IFACES_FILE='/etc/network/interfaces' 

STATUS=$(ip address show "$IFACE" | grep -o "$VIP") 

if [ ! -z "$STATUS" ]; then 
    ip_addresses=($(grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' "$IFACES_FILE")) 
    for ip in "${ip_addresses[@]}"; do 
     ip address add "$ip" dev "$IFACE" 
    done 
fi 

Dies ist ein vereinfachtes Beispiel. Möglicherweise möchten Sie weitere Prüfungen hinzufügen, einige Protokollierungsnachrichten hinzufügen, um die Ausgabe für das Debuggen nützlich zu machen. Abhängig von Ihrer Serverkonfiguration funktionieren einige Befehle möglicherweise auch nicht ohne sudo.

0

Dank Andrii L. Ich habe Ihre Lösung verbessert:

#!/bin/bash 
IFACE='eth0' 
VIP='2.2.2.2' 
IFACES_FILE='/etc/network/interfaces' 

STATUS=$(ip address show "$IFACE" | grep -o "$VIP") 

if [ ! -z "$STATUS" ]; then 
ip_addresses=($(grep -o 'up ip addr add [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' "$IFACES_FILE" | grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*')) 
for ip in "${ip_addresses[@]}"; do 
ip address add "$ip"/32 dev "$IFACE" 
done 
else 
for ip in "${ip_addresses[@]}"; do 
ip address del "$ip"/32 dev "$IFACE" 
done 
fi 

sonst versucht, alle IP-Adressen und Sendungen in/etc/network/interfaces Datei gefunden hinzuzufügen.

Verwandte Themen