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

endl
评论