2016-08-08 18 views
0

在HA配置中,我定期检查eth0上的VIP地址(可以称它为2.2.2.2)。如果是,那么我需要调出另一组在/ etc /网络/接口的配置文件为eth0定义的IP地址的:Bash grep文件的字符串和使用每个作为另一个命令中的变量

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 

,并通过每个IP只到另一组命令:

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 

什么我迄今所做的是:

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

现在我需要帮助如何通过每条线以上(IP AA 1.2.3 ...)所提及的其他命令,但不知道如何正确地做到这一点。

(可选)如果系统中不存在VIP,则可以选择恢复操作 - 以防主要HA主机脱机。实现这一

回答

0

一种方式将是对所有的IP地址解析成一个阵列,并使用for环路将它们分配给该接口:

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

这是一个简化的例子。您可能想要添加更多检查,添加一些日志消息以提供对调试有用的输出。此外,根据您的服务器配置,某些命令可能无法运行,没有sudo

0

感谢安德里·L.我已经改善您的解决方案:

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

否则就尝试添加在/ etc /网络/接口文件中找到的所有IP地址和广播。

相关问题