From b6b74903d9639a8a0a51594d1b8c026130a1f1ec Mon Sep 17 00:00:00 2001 From: joy Date: Thu, 30 Oct 2025 14:05:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20scripts/keepalived.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/keepalived.sh | 250 ++++++++++++++++++++++-------------------- 1 file changed, 131 insertions(+), 119 deletions(-) diff --git a/scripts/keepalived.sh b/scripts/keepalived.sh index 3dd2d3b..a82b6a9 100644 --- a/scripts/keepalived.sh +++ b/scripts/keepalived.sh @@ -1,7 +1,21 @@ #!/bin/bash set -euo pipefail -# 初始化变量 +# ========================== 全局配置 ========================== +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# 打印工具函数 +info() { echo -e "${YELLOW}[INFO]${NC} $1"; } +success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } +error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; } +step() { echo -e "\n${BLUE}>> $1${NC}"; } + +# 配置参数 ACTION="" VIP="" PRIORITY=150 @@ -9,112 +23,86 @@ INTERFACE="" KEEPALIVED_CONF="/etc/keepalived/keepalived.conf" CHECK_SCRIPT="/usr/local/bin/check_haproxy.sh" -# 打印帮助信息 + +# ========================== 帮助信息 ========================== usage() { - echo "用法: $0 [操作] [选项]" - echo "操作:" - echo " --install 安装并配置keepalived" - echo " --uninstall 卸载keepalived并清理配置" - echo "安装选项:" - echo " --vip 必选,虚拟IP(格式:192.168.1.100/24)" - echo " --priority <数值> 可选,优先级(默认150,主节点设高)" - echo "示例:" - echo " 安装主节点: $0 --install --vip 192.168.1.100/24 --priority 150" - echo " 安装备节点: $0 --install --vip 192.168.1.100/24 --priority 140" - echo " 卸载: $0 --uninstall" + cat << EOF +Keepalived 高可用配置脚本(适配K8s VIP管理) +功能:安装/卸载Keepalived,配置虚拟IP(VIP)及HAProxy健康检查 + +用法: $0 [操作] [选项] + +操作: + --install 安装并配置Keepalived + --uninstall 卸载Keepalived及清理配置 + +安装选项: + --vip 必选,虚拟IP(格式:192.168.1.100/24) + --priority <数值> 可选,节点优先级(默认150,主节点建议150+,备节点140-) + +示例: + 主节点安装: $0 --install --vip 192.168.61.200/24 --priority 150 + 备节点安装: $0 --install --vip 192.168.61.200/24 --priority 140 + 卸载: $0 --uninstall +EOF exit 1 } -# 解析参数 -while [[ $# -gt 0 ]]; do - case "$1" in - --install|--uninstall) - ACTION="$1" - shift - ;; - --vip) - VIP="$2" - shift 2 - ;; - --priority) - PRIORITY="$2" - shift 2 - ;; - *) - echo "错误:未知参数 $1" - usage - ;; - esac -done -# 校验操作参数 -if [[ -z "$ACTION" ]]; then - echo "错误:必须指定 --install 或 --uninstall" - usage -fi - -# 检查root权限 -if [[ $EUID -ne 0 ]]; then - echo "错误:脚本必须以root权限运行(使用sudo)" - exit 1 -fi - -# 获取默认网卡 +# ========================== 工具函数 ========================== +# 获取默认网卡(非回环,第一个激活的网卡) get_default_interface() { - INTERFACE=$(ip -br link show | grep -v LOOPBACK | awk '{print $1}' | head -n 1) - if [[ -z "$INTERFACE" ]]; then - echo "错误:无法获取默认网卡,请手动检查网络接口" - exit 1 - fi - echo "使用默认网卡:$INTERFACE" + INTERFACE=$(ip -br link show up | grep -v LOOPBACK | awk '{print $1}' | head -n1) + [[ -z "$INTERFACE" ]] && error "无法获取有效网卡,请检查网络接口状态" + info "自动获取网卡:$INTERFACE" } -# 安装keepalived -install_keepalived() { - # 校验安装参数 - if [[ -z "$VIP" ]]; then - echo "错误:安装必须指定 --vip(格式:IP/子网掩码)" - usage - fi - if ! [[ "$VIP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]]; then - echo "错误:VIP格式无效(正确格式:192.168.1.100/24)" - exit 1 - fi +# ========================== 安装逻辑 ========================== +install_keepalived() { + # 参数校验 + [[ -z "$VIP" ]] && error "必须通过--vip指定虚拟IP(格式:IP/子网掩码,如192.168.61.200/24)" + [[ ! "$VIP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]] && error "VIP格式无效,正确格式:192.168.61.200/24" + [[ ! "$PRIORITY" =~ ^[0-9]+$ ]] && error "优先级必须是整数(如150)" + + step "开始安装Keepalived" + # 获取网卡 get_default_interface - # 安装软件 - echo "===== 开始安装keepalived =====" - apt update >/dev/null - apt install -y keepalived >/dev/null || { echo "keepalived安装失败"; exit 1; } + # 安装软件(静默模式,去除apt警告) + info "安装Keepalived软件包..." + apt update -qq >/dev/null 2>&1 + apt install -y -qq keepalived >/dev/null 2>&1 || error "Keepalived安装失败" + success "Keepalived软件包安装完成" - # 备份原有配置(若存在) + # 备份原有配置 if [[ -f "$KEEPALIVED_CONF" ]]; then - mv "$KEEPALIVED_CONF" "${KEEPALIVED_CONF}.bak.$(date +%F_%H%M%S)" - echo "已备份原有配置文件" + local backup="${KEEPALIVED_CONF}.bak.$(date +%F_%H%M%S)" + mv "$KEEPALIVED_CONF" "$backup" + info "原有配置已备份至:$backup" fi - # 创建健康检查脚本 - echo "创建健康检查脚本..." + # 创建健康检查脚本(监控HAProxy状态) + info "创建HAProxy健康检查脚本..." cat > "$CHECK_SCRIPT" << 'EOF' #!/bin/bash -if ! pgrep -x "haproxy" >/dev/null; then - systemctl stop keepalived - exit 1 -else - exit 0 -fi +pgrep -x "haproxy" >/dev/null 2>&1 || { systemctl stop keepalived; exit 1; } +exit 0 EOF - chmod +x "$CHECK_SCRIPT" + chmod +x "$CHECK_SCRIPT" || error "健康检查脚本权限设置失败" + success "健康检查脚本已创建:$CHECK_SCRIPT" # 生成配置文件 - echo "生成keepalived配置..." + info "生成Keepalived配置..." + local state="BACKUP" + [[ "$PRIORITY" -ge 150 ]] && state="MASTER" # 优先级≥150默认为主节点 + cat > "$KEEPALIVED_CONF" << EOF global_defs { router_id LVS_K8S_$(hostname) script_security 2 - enable_script_security + enable_script_security } vrrp_script check_haproxy { @@ -124,7 +112,7 @@ vrrp_script check_haproxy { } vrrp_instance VI_1 { - state $(if [[ $PRIORITY -ge 150 ]]; then echo "MASTER"; else echo "BACKUP"; fi) + state $state interface $INTERFACE virtual_router_id 51 priority $PRIORITY @@ -141,64 +129,88 @@ vrrp_instance VI_1 { } } EOF + [[ -f "$KEEPALIVED_CONF" ]] || error "配置文件生成失败" + success "配置文件已生成:$KEEPALIVED_CONF" # 启动服务 - systemctl enable keepalived - systemctl start keepalived - if systemctl is-active --quiet keepalived; then - echo "===== keepalived安装完成 =====" - echo "VIP:$VIP" - echo "优先级:$PRIORITY" - echo "网卡:$INTERFACE" - else - echo "错误:keepalived启动失败,请查看日志 journalctl -u keepalived" - exit 1 - fi + info "启动并设置开机自启..." + systemctl enable --now keepalived >/dev/null 2>&1 || error "Keepalived启动失败(日志:journalctl -u keepalived)" + [[ "$(systemctl is-active keepalived)" == "active" ]] || error "Keepalived启动后状态异常" + + # 安装完成汇总 + echo -e "\n${GREEN}===== 安装完成 =====${NC}" + echo " VIP: $VIP" + echo " 节点角色: $state(优先级: $PRIORITY)" + echo " 绑定网卡: $INTERFACE" + echo " 健康检查: $CHECK_SCRIPT" + echo " 服务状态: 运行中" } -# 卸载keepalived + +# ========================== 卸载逻辑 ========================== uninstall_keepalived() { - echo "===== 开始卸载keepalived =====" + step "开始卸载Keepalived" # 停止服务 if systemctl is-active --quiet keepalived; then - systemctl stop keepalived - echo "已停止keepalived服务" + info "停止Keepalived服务..." + systemctl stop keepalived >/dev/null 2>&1 || info "服务停止失败,继续卸载" + success "服务已停止" + else + info "Keepalived未运行,跳过停止步骤" fi # 卸载软件 if dpkg -l keepalived &>/dev/null; then - apt purge -y keepalived >/dev/null - apt autoremove -y >/dev/null - echo "已卸载keepalived软件包" + info "卸载软件包..." + apt purge -y -qq keepalived >/dev/null 2>&1 || error "软件包卸载失败" + apt autoremove -y -qq >/dev/null 2>&1 + success "软件包已卸载" else - echo "keepalived未安装,跳过卸载" + info "Keepalived未安装,跳过卸载" fi - # 清理配置文件(保留备份提示) + # 清理配置 if [[ -d /etc/keepalived/ ]]; then - mv /etc/keepalived/ "/etc/keepalived.bak.$(date +%F_%H%M%S)" - echo "配置文件已备份至 /etc/keepalived.bak.xxx" + local backup="/etc/keepalived.bak.$(date +%F_%H%M%S)" + mv /etc/keepalived/ "$backup" + success "配置目录已备份至:$backup" fi # 清理健康检查脚本 if [[ -f "$CHECK_SCRIPT" ]]; then rm -f "$CHECK_SCRIPT" - echo "已删除健康检查脚本" + success "健康检查脚本已删除:$CHECK_SCRIPT" fi - echo "===== keepalived卸载完成 =====" + # 卸载完成 + echo -e "\n${GREEN}===== 卸载完成 =====${NC}" } -# 执行操作 -case "$ACTION" in - --install) - install_keepalived - ;; - --uninstall) - uninstall_keepalived - ;; - *) - usage - ;; -esac \ No newline at end of file + +# ========================== 主逻辑 ========================== +main() { + # 解析参数 + while [[ $# -gt 0 ]]; do + case "$1" in + --install|--uninstall) ACTION="$1"; shift ;; + --vip) [[ $# -lt 2 ]] && error "--vip需指定IP/子网掩码"; VIP="$2"; shift 2 ;; + --priority) [[ $# -lt 2 ]] && error "--priority需指定数值"; PRIORITY="$2"; shift 2 ;; + *) error "未知参数:$1" ;; + esac + done + + # 校验操作 + [[ -z "$ACTION" ]] && error "必须指定--install(安装)或--uninstall(卸载)" + + # 检查root权限 + [[ $EUID -ne 0 ]] && error "请使用root权限运行(sudo $0 ...)" + + # 执行操作 + case "$ACTION" in + --install) install_keepalived ;; + --uninstall) uninstall_keepalived ;; + esac +} + +main "$@"