在HA配置中,我定期检查eth0上的VIP地址(让我们称之为2.2.2.2)。如果启动,则需要在/etc/ eth0 /interface配置文件中调出为网络定义的另一组IP地址:
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 a a 1.2.3...),但不知道如何正确地做到这一点。
如果系统中不存在VIP,我还可以恢复操作-以防主要HA主机脱机。
发布于 2016-08-08 23:46:20
实现此目的的一种方法是将所有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
的情况下可能无法工作。
发布于 2016-08-09 16:45:36
谢谢Andrii 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/network/interface文件中找到的所有in和广播。
https://stackoverflow.com/questions/38831002
复制相似问题