lvs主备同步脚本

来源:互联网 发布:网络篮球游戏 编辑:程序博客网 时间:2024/06/08 13:19
#!/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
原创粉丝点击