2016-08-08 4 views
0

В конфигурации HA я периодически проверяю VIP-адрес на eth0, (позвольте назвать его 2.2.2.2). Если вверх, то мне нужно, чтобы открыть еще одну группу IP-адрес, определенный для eth0 в/и т.д.// файл конфигурации сетевых интерфейсов: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 

Теперь мне нужна помощь, как передать каждую строку другой команды, упомянутой выше (ф аа 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 

в противном случае он пытается добавить все IP-адрес и широковещательные найденный в сети и т.д./файл// интерфейсы.