标签搜索

keepalived安装脚本初始化

lilymaxyz
2025-05-25 / 0 评论 / 11 阅读 / 正在检测是否收录...

keepalived安装脚本初始化

#!/bin/bash
# *************************************
# * 功能: keepalived安装部署脚本
# * 作者: 刘丹玉
# * 联系: v649352141@163.com
# * 版本: 2025-05-24
# *************************************

# 错误处理:如果命令执行失败,脚本将终止
set -e

# 定义日志文件路径
# LOG_FILE="/var/log/keepalived_install.log"
# | tee -a ${LOG_FILE}

# 定义环境变量
KEEPALIVED_VERSION="2.3.3"
KEEPALIVED_INSTALL_PATH="/data/server/keepalived"
KEEPALIVED_TAR_NAME="keepalived-${KEEPALIVED_VERSION}"
read -p "当前节点的角色(MASTER|BACKUP): " KEEPALIVED_ROLE

# 查看属于Rocky、Ubuntu、openEuler系列
os_type () {
   awk -F'[ "]' '/^NAME/{print $2}' /etc/os-release
}

# 定义日志记录函数
function log() {
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    local message="$1"
    echo "[${timestamp}] ${message}"
}

# 定义函数:基本环境定制
function setup_environment() {
    log "开始基本环境定制"
    echo "正在更新软件包列表..."
    if [ $(os_type) == "Rocky" ];then
        yum install -y gcc curl openssl-devel libnl3-devel net-snmp-devel rsyslog >/dev/null 2>&1
    elif [ $(os_type) == "Ubuntu" ] ;then
        if [ $? -eq 0 ]; then
            log "软件包列表更新成功"
        else
            log "软件包列表更新失败"
            exit 1
        fi

        echo "正在安装必要的软件包..."
        apt update >/dev/null 2>&1 && apt -y install make gcc \
        ipvsadm build-essential pkg-config automake autoconf libipset-dev \
        libnl-3-dev libnl-genl-3-dev libssl-dev libxtables-dev libip4tc-dev libip6tc-dev \
        libmagic-dev libsnmp-dev libglib2.0-dev libpcre2-dev libnftnl-dev libmnl-dev libsystemd-dev \
        libpopt-dev daemon >/dev/null 2>&1
        if [ $? -eq 0 ]; then
            log "必要软件包安装成功"
        else
            log "必要软件包安装失败"
            exit 1
        fi
    else
        color "$(os_type) 暂不支持此版本" 3
    fi
}

# 定义函数:下载软件
function download_software() {
    log "开始下载软件"
    echo "正在创建目录并下载 Keepalived ${KEEPALIVED_VERSION}..."
    mkdir -p /data/{server,softs}
    if [ $? -eq 0 ]; then
        log "目录创建成功"
    else
        log "目录创建失败"
        exit 1
    fi
    
    cd /data/softs
    if [ ! -f ${KEEPALIVED_TAR_NAME}.tar.gz ]; then
        keepalived_url="https://keepalived.org/software/${KEEPALIVED_TAR_NAME}.tar.gz"
        wget "${keepalived_url}" >/dev/null 2>&1
        if [ $? -eq 0 ]; then
            log "Keepalived ${KEEPALIVED_VERSION} 下载成功"
        else
            log "Keepalived ${KEEPALIVED_VERSION} 下载失败"
            exit 1
        fi
    fi

    echo "正在解压 Keepalived ${KEEPALIVED_VERSION}..."
    untar_dir="/data/softs/${KEEPALIVED_TAR_NAME}"
    [ -d ${untar_dir} ] && rm -rf ${untar_dir}
    tar xf "${KEEPALIVED_TAR_NAME}.tar.gz"
    if [ $? -eq 0 ]; then
        log "Keepalived ${KEEPALIVED_VERSION} 解压成功"
    else
        log "Keepalived ${KEEPALIVED_VERSION} 解压失败"
        exit 1
    fi
}

# 定义函数:编译安装
function compile_and_install() {

    log "开始编译安装"
    echo "正在进入解压目录并进行配置..."
    cd "${KEEPALIVED_TAR_NAME}"
    ./configure --prefix="${KEEPALIVED_INSTALL_PATH}" >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        log "配置成功,安装路径为 ${KEEPALIVED_INSTALL_PATH}"
    else
        log "配置失败,安装路径为 ${KEEPALIVED_INSTALL_PATH}"
        exit 1
    fi

    echo "正在编译 Keepalived ${KEEPALIVED_VERSION}..."
    make -j $(nproc) >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        log "编译成功"
    else
        log "编译失败"
        exit 1
    fi
    
    echo "正在安装 Keepalived ${KEEPALIVED_VERSION} 到 ${KEEPALIVED_INSTALL_PATH}..."
    make install >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        log "安装成功,安装路径为 ${KEEPALIVED_INSTALL_PATH}"
    else
        log "安装失败,安装路径为 ${KEEPALIVED_INSTALL_PATH}"
        exit 1
    fi
}

# 定义函数:定制服务文件
function customize_service_file() {
    log "开始定制服务文件"
    echo "正在复制服务文件..."
    cd /data/softs/${KEEPALIVED_TAR_NAME}/keepalived
    cp keepalived.service /usr/lib/systemd/system/keepalived.service
    if [ $? -eq 0 ]; then
        log "服务文件复制成功"
    else
        log "服务文件复制失败"
        exit 1
    fi
}

# 定义函数:定制配置文件
function customize_config_file() {
    log "开始定制配置文件"
    echo "正在定制配置文件..."
    cd "${KEEPALIVED_INSTALL_PATH}/etc/keepalived/"
    echo "正在导入man手册..."
    cp ${KEEPALIVED_INSTALL_PATH}/share/man/man1/* /usr/share/man/man1/
    cp ${KEEPALIVED_INSTALL_PATH}/share/man/man5/* /usr/share/man/man5/
    cp ${KEEPALIVED_INSTALL_PATH}/share/man/man8/* /usr/share/man/man8/

    mv keepalived.conf.sample ${KEEPALIVED_INSTALL_PATH}/etc/keepalived/keepalived.conf
    net_name=$(ip a | awk -F " |:" '/MULTICAST/{print $3}'|head -n1)
    sed -i "s/eth0/${net_name}/g" ${KEEPALIVED_INSTALL_PATH}/etc/keepalived/keepalived.conf
    sed -i '/virtual_server/,$d' ${KEEPALIVED_INSTALL_PATH}/etc/keepalived/keepalived.conf

    if [ $(os_type) == "Rocky" ];then
        sed -i "/^ *vrrp_strict/s/^/#/" ${KEEPALIVED_INSTALL_PATH}/etc/keepalived/keepalived.conf
    fi
    

    if [ "${KEEPALIVED_ROLE}" == "BACKUP" ]; then
        sed -i 's/MASTER/BACKUP/' ${KEEPALIVED_INSTALL_PATH}/etc/keepalived/keepalived.conf
        sed -i 's/ty 100/ty 90/' ${KEEPALIVED_INSTALL_PATH}/etc/keepalived/keepalived.conf
    fi
    if [ $? -eq 0 ]; then
        log "配置文件定制成功,安装路径为 ${KEEPALIVED_INSTALL_PATH}"
    else
        log "配置文件定制失败,安装路径为 ${KEEPALIVED_INSTALL_PATH}"
        exit 1
    fi
}

# 定义函数:启动服务
function start_service() {
    log "开始启动服务"
    echo "正在重新加载 systemd 管理器配置..."
    systemctl daemon-reload
    if [ $? -eq 0 ]; then
        log "systemd 管理器配置重新加载成功"
        systemctl enable --now keepalived >/dev/null 2>&1
        sleep 2
    else
        log "systemd 管理器配置重新加载失败"
        exit 1
    fi
}

# 定义函数:移除默认的策略规则
function move_nft_flush_rule (){
    > /etc/nftables.conf
    sleep 2
    nft flush ruleset
    cat > /usr/lib/systemd/system/nft-flush.service <<EOF
[Unit]
Description=Flush nftables Rules at Boot
After=network.target
Wants=network-online.target
Conflicts=shutdown.target

[Service]
Type=oneshot
# 清空规则
ExecStart=/usr/sbin/nft flush ruleset
# 确保执行顺序
ExecStartPost=/bin/sleep 1

[Install]
WantedBy=multi-user.target
EOF
    sleep 1
    systemctl daemon-reload
    systemctl start nft-flush.service
    systemctl enable --now nft-flush.service >/dev/null 2>&1
}



# 主函数,按顺序调用各个子函数
function main() {
    # 检查环境变量是否为空
    if [ -z "${KEEPALIVED_VERSION}" ]; then
        log "错误:KEEPALIVED_VERSION 环境变量为空"
        exit 1
    fi
    
    if [ -z "${KEEPALIVED_INSTALL_PATH}" ]; then
        log "错误:KEEPALIVED_INSTALL_PATH 环境变量为空"
        exit 1
    fi

    setup_environment
    download_software
    compile_and_install
    customize_service_file
    customize_config_file
    start_service
    move_nft_flush_rule
    log "Keepalived ${KEEPALIVED_VERSION} 安装及配置完成,安装路径为: ${KEEPALIVED_INSTALL_PATH}!"
    echo "Keepalived ${KEEPALIVED_VERSION} 安装及配置完成,安装路径为: ${KEEPALIVED_INSTALL_PATH}!"
}

# 调用主函数
main

image-20250524205548145

endl

0

评论

博主关闭了所有页面的评论