#!/bin/bash
# 本脚本用于在188上互相同步主备LVS的keepalived.conf配置文件
# 维护人: 方冲 2015/09/01
# 更新主备网卡识别问题
# 更新网卡识别问题 添加匹配参数"/"
# 2015/10/21 解决bug:在过滤优先级时出现/r字符 使用tr解决
function push_lvs(){
local mode=$1 # m2b或b2m
local src_lvs=$2
local dst_lvs=$3
while : ; do
read -e -p "确认从$src_lvs同步keepalived.conf配置到$dst_lvs? [Yes/No]: " confirm
(echo $confirm |egrep -qi '^no$') && confirm=no && break
(echo $confirm |egrep -qi '^yes$') && confirm=yes && break
done
[ "$confirm" == 'yes' ] || return 0
tmp_dir=`mktemp`
sudo rm -rf $tmp_dir
sudo mkdir -p $tmp_dir/$src_lvs $tmp_dir/$dst_lvs
echo "获取[$src_lvs]的keepalived.conf..."
sudo scp -P12321 $src_lvs:/etc/keepalived/keepalived.conf $tmp_dir/$src_lvs/
[ $? -ne 0 ] && echo 失败 && return 1 || echo -e '\033[32m获取成功 备份路径:'$tmp_dir/$src_lvs/' \033[0m'
echo "获取主备网卡..."
src_net=`sudo ssh -p12321 $src_lvs ip addr | grep "inet $src_lvs/" | awk '{print $NF}'`
[ $? -ne 0 ] && echo 失败 && return 1 || echo -e '\033[32m主'[$src_lvs]'priority: '$src_net'\033[0m'
dst_net=`sudo ssh -p12321 $dst_lvs ip addr | grep "inet $dst_lvs/" | awk '{print $NF}'`
[ $? -ne 0 ] && echo 失败 && return 1 || echo -e '\033[32m备'[$dst_lvs]'priority: '$dst_net'\033[0m'
echo "计算priority优先级..."
src_pri=`grep -v "#" $tmp_dir/$src_lvs/keepalived.conf | tr '\r' ' ' | awk '/priority/{print $2}' `
if ( echo $src_pri |egrep -q '^[0-9]+$' ); then
true
else
echo 获取priority失败 查看$src_lvs是否同时存在两个vrrp,如果是请将两个合成一个。 && return 2
fi
if [ $mode == "m2b" ]; then
let dst_pri=$src_pri-50
echo "主[$src_lvs]priority: $src_pri"
echo "备[$dst_lvs]priority: $dst_pri"
elif [ $mode == "b2m" ]; then
let dst_pri=$src_pri+50
echo "备[$src_lvs]priority: $src_pri"
echo "主[$dst_lvs]priority: $dst_pri"
else
echo mode参数传入不合法 && return 2
fi
#
echo "生成[$dst_lvs]的keepalived.conf..."
sudo sed "/priority/s/$src_pri/$dst_pri/" $tmp_dir/$src_lvs/keepalived.conf >$tmp_dir/$dst_lvs/keepalived.conf
[ $? -ne 0 ] && echo "更新优先级失败" && return 3 || echo -e '\033[32m成功\033[0m'
sudo sed -i s/$src_net/$dst_net/g $tmp_dir/$dst_lvs/keepalived.conf
[ $? -ne 0 ] && echo "更新网卡失败" && return 3 || echo -e '\033[32m成功\033[0m'
echo "发布keepalived.conf到[$dst_lvs]的LVS..."
sudo scp -P12321 $tmp_dir/$dst_lvs/keepalived.conf $dst_lvs:/etc/keepalived/
[ $? -ne 0 ] && echo "发布失败" && return 4 || echo -e '\033[32m发布成功 备份路径:'$tmp_dir/$dst_lvs/'\033[0m'
echo "reload[$dst_lvs]LVS的keepalived配置..."
sudo ssh -p12321 $dst_lvs /etc/init.d/keepalived reload
[ $? -ne 0 ] && echo "reload 失败" && return 5 || echo -e '\033[32m成功\033[0m'
# rm -rf $tmp_dir
}
################
HELP_INFO=`echo -e "\033[33m
注意:
1. 此脚本提供LVS的keepalived.conf的互为同步功能,不支持heartbeat同步
2. 脚本会根据主备同步方向自动增减priority优先级
3. 脚本会自动识别主备机器所使用的网卡
4. 请先在主或备LVS修改keepalived.conf并完成reload后再使用
\033[0m
用法举例:主LVS: 1.1.1.1 备LVS: 2.2.2.2
主 => 备: [priority减小50]
\033[33msudo $0 --m2b 1.1.1.1 2.2.2.2 \033[0m
备 => 主: [priority加大50]
\033[33msudo $0 --b2m 2.2.2.2 1.1.1.1 \033[0m
"`
# precheck
[ $UID -ne 0 ] && echo 请用sudo执行 && exit 1
[ $# -eq 0 ] && echo "$HELP_INFO" && exit 2
ipcalc -c $2 || { echo "[$2]不是合法IP, 请检查" ; exit ; }
ipcalc -c $3 || { echo "[$3]不是合法IP, 请检查" ; exit ; }
case $1 in
--m2b)
push_lvs m2b $2 $3
;;
--b2m)
push_lvs b2m $2 $3
;;
*)
echo "$HELP_INFO"
;;
esac
# 本脚本用于在188上互相同步主备LVS的keepalived.conf配置文件
# 维护人: 方冲 2015/09/01
# 更新主备网卡识别问题
# 更新网卡识别问题 添加匹配参数"/"
# 2015/10/21 解决bug:在过滤优先级时出现/r字符 使用tr解决
function push_lvs(){
local mode=$1 # m2b或b2m
local src_lvs=$2
local dst_lvs=$3
while : ; do
read -e -p "确认从$src_lvs同步keepalived.conf配置到$dst_lvs? [Yes/No]: " confirm
(echo $confirm |egrep -qi '^no$') && confirm=no && break
(echo $confirm |egrep -qi '^yes$') && confirm=yes && break
done
[ "$confirm" == 'yes' ] || return 0
tmp_dir=`mktemp`
sudo rm -rf $tmp_dir
sudo mkdir -p $tmp_dir/$src_lvs $tmp_dir/$dst_lvs
echo "获取[$src_lvs]的keepalived.conf..."
sudo scp -P12321 $src_lvs:/etc/keepalived/keepalived.conf $tmp_dir/$src_lvs/
[ $? -ne 0 ] && echo 失败 && return 1 || echo -e '\033[32m获取成功 备份路径:'$tmp_dir/$src_lvs/' \033[0m'
echo "获取主备网卡..."
src_net=`sudo ssh -p12321 $src_lvs ip addr | grep "inet $src_lvs/" | awk '{print $NF}'`
[ $? -ne 0 ] && echo 失败 && return 1 || echo -e '\033[32m主'[$src_lvs]'priority: '$src_net'\033[0m'
dst_net=`sudo ssh -p12321 $dst_lvs ip addr | grep "inet $dst_lvs/" | awk '{print $NF}'`
[ $? -ne 0 ] && echo 失败 && return 1 || echo -e '\033[32m备'[$dst_lvs]'priority: '$dst_net'\033[0m'
echo "计算priority优先级..."
src_pri=`grep -v "#" $tmp_dir/$src_lvs/keepalived.conf | tr '\r' ' ' | awk '/priority/{print $2}' `
if ( echo $src_pri |egrep -q '^[0-9]+$' ); then
true
else
echo 获取priority失败 查看$src_lvs是否同时存在两个vrrp,如果是请将两个合成一个。 && return 2
fi
if [ $mode == "m2b" ]; then
let dst_pri=$src_pri-50
echo "主[$src_lvs]priority: $src_pri"
echo "备[$dst_lvs]priority: $dst_pri"
elif [ $mode == "b2m" ]; then
let dst_pri=$src_pri+50
echo "备[$src_lvs]priority: $src_pri"
echo "主[$dst_lvs]priority: $dst_pri"
else
echo mode参数传入不合法 && return 2
fi
#
echo "生成[$dst_lvs]的keepalived.conf..."
sudo sed "/priority/s/$src_pri/$dst_pri/" $tmp_dir/$src_lvs/keepalived.conf >$tmp_dir/$dst_lvs/keepalived.conf
[ $? -ne 0 ] && echo "更新优先级失败" && return 3 || echo -e '\033[32m成功\033[0m'
sudo sed -i s/$src_net/$dst_net/g $tmp_dir/$dst_lvs/keepalived.conf
[ $? -ne 0 ] && echo "更新网卡失败" && return 3 || echo -e '\033[32m成功\033[0m'
echo "发布keepalived.conf到[$dst_lvs]的LVS..."
sudo scp -P12321 $tmp_dir/$dst_lvs/keepalived.conf $dst_lvs:/etc/keepalived/
[ $? -ne 0 ] && echo "发布失败" && return 4 || echo -e '\033[32m发布成功 备份路径:'$tmp_dir/$dst_lvs/'\033[0m'
echo "reload[$dst_lvs]LVS的keepalived配置..."
sudo ssh -p12321 $dst_lvs /etc/init.d/keepalived reload
[ $? -ne 0 ] && echo "reload 失败" && return 5 || echo -e '\033[32m成功\033[0m'
# rm -rf $tmp_dir
}
################
HELP_INFO=`echo -e "\033[33m
注意:
1. 此脚本提供LVS的keepalived.conf的互为同步功能,不支持heartbeat同步
2. 脚本会根据主备同步方向自动增减priority优先级
3. 脚本会自动识别主备机器所使用的网卡
4. 请先在主或备LVS修改keepalived.conf并完成reload后再使用
\033[0m
用法举例:主LVS: 1.1.1.1 备LVS: 2.2.2.2
主 => 备: [priority减小50]
\033[33msudo $0 --m2b 1.1.1.1 2.2.2.2 \033[0m
备 => 主: [priority加大50]
\033[33msudo $0 --b2m 2.2.2.2 1.1.1.1 \033[0m
"`
# precheck
[ $UID -ne 0 ] && echo 请用sudo执行 && exit 1
[ $# -eq 0 ] && echo "$HELP_INFO" && exit 2
ipcalc -c $2 || { echo "[$2]不是合法IP, 请检查" ; exit ; }
ipcalc -c $3 || { echo "[$3]不是合法IP, 请检查" ; exit ; }
case $1 in
--m2b)
push_lvs m2b $2 $3
;;
--b2m)
push_lvs b2m $2 $3
;;
*)
echo "$HELP_INFO"
;;
esac