ansible-devops/scripts/k8s-config-deploy.sh

209 lines
7.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -euo pipefail
# ========================== 固定配置 ==========================
TEMPLATE_URL="http://116.205.97.109/scripts/kubeadm-conf.yaml" # 固定模板地址
LOCAL_TEMPLATE="/tmp/k8s-template-$(date +%s).yaml" # 本地临时模板
REMOTE_CONFIG_PATH="/opt/k8s-install-conf/kubeadm-conf.yaml" # 远程配置路径
REMOTE_USER="root" # 默认远程用户
# ========================== 工具函数 ==========================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
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; }
# ========================== 参数解析(简化版) ==========================
# 核心变量仅保留必要参数target-ip = local-ip
LOCALIP="" # 节点IP同时作为目标服务器IP
HOSTNAME="" # 节点主机名
MASTER1_IP="" # 第1个MASTER01_IP替换值
MASTER2_IP="" # 第2个MASTER01_IP替换值
MASTER3_IP="" # 第3个MASTER01_IP替换值
CLUSTER_VIP="" # 集群VIP
K8SVERSION="" # K8s版本
CLUSTER_PORT="" # API端口
parse_args() {
while [[ $# -gt 0 ]]; do
case "$1" in
--local-ip)
LOCALIP="$2"
shift 2
;;
--hostname)
HOSTNAME="$2"
shift 2
;;
--master1-ip)
MASTER1_IP="$2"
shift 2
;;
--master2-ip)
MASTER2_IP="$2"
shift 2
;;
--master3-ip)
MASTER3_IP="$2"
shift 2
;;
--cluster-vip)
CLUSTER_VIP="$2"
shift 2
;;
--k8s-version)
K8SVERSION="$2"
shift 2
;;
--cluster-port)
CLUSTER_PORT="$2"
shift 2
;;
--remote-user)
REMOTE_USER="$2"
shift 2
;;
--help)
echo "用法:$0 [必选参数] [可选参数]"
echo "功能下载模板→替换变量→拷贝到local-ip对应的服务器→远程执行命令"
echo "说明target-ip与local-ip相同无需单独指定"
echo "必选参数:"
echo " --local-ip <IP> 节点IP同时作为目标服务器IP如192.168.61.10"
echo " --hostname <名称> 模板中替换的HOSTNAME如master-01"
echo " --master1-ip <IP> 第1个MASTER01_IP替换值如192.168.61.10"
echo " --master2-ip <IP> 第2个MASTER01_IP替换值如192.168.61.11"
echo " --master3-ip <IP> 第3个MASTER01_IP替换值如192.168.61.12"
echo " --cluster-vip <IP> 模板中替换的CLUSTER_VIP如192.168.61.200"
echo " --k8s-version <版本> 模板中替换的K8SVERSION如1.30.5"
echo " --cluster-port <端口> 模板中替换的CLUSTER_PORT如6443"
echo "可选参数:"
echo " --remote-user <用户> 远程登录用户默认root"
echo "示例:"
echo " 部署到master-01"
echo " $0 --local-ip 192.168.61.10 --hostname master-01 \\"
echo " --master1-ip 192.168.61.10 --master2-ip 192.168.61.11 --master3-ip 192.168.61.12 \\"
echo " --cluster-vip 192.168.61.200 --k8s-version 1.30.5 --cluster-port 6443"
exit 0
;;
*)
error "未知参数:$1(执行$0 --help查看用法"
;;
esac
done
# 校验必选参数
local required_params=(
"LOCALIP" "HOSTNAME" "MASTER1_IP" "MASTER2_IP" "MASTER3_IP"
"CLUSTER_VIP" "K8SVERSION" "CLUSTER_PORT"
)
for param in "${required_params[@]}"; do
if [[ -z "${!param}" ]]; then
error "缺少必选参数:--${param,,}"
fi
done
# 校验IP和端口格式
if ! [[ "$LOCALIP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
error "无效的local-ip格式$LOCALIP"
fi
if ! [[ "$CLUSTER_PORT" =~ ^[0-9]+$ ]] || [[ "$CLUSTER_PORT" -lt 1 ]] || [[ "$CLUSTER_PORT" -gt 65535 ]]; then
error "无效的端口:$CLUSTER_PORT"
fi
}
# ========================== 核心步骤 ==========================
# 步骤1下载模板
download_template() {
info "下载模板:$TEMPLATE_URL"
if command -v wget &>/dev/null; then
wget -q -O "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || error "wget下载失败"
elif command -v curl &>/dev/null; then
curl -s -o "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || error "curl下载失败"
else
error "请安装wget或curl"
fi
[[ -f "$LOCAL_TEMPLATE" ]] || error "模板下载失败"
success "模板下载完成"
}
# 步骤2替换变量核心逻辑不变
replace_variables() {
info "替换模板变量..."
# 基础变量替换
sed -i "s/LOCALIP/$LOCALIP/g" "$LOCAL_TEMPLATE"
sed -i "s/HOSTNAME/$HOSTNAME/g" "$LOCAL_TEMPLATE"
sed -i "s/K8SVERSION/$K8SVERSION/g" "$LOCAL_TEMPLATE"
sed -i "s/CLUSTER_VIP/$CLUSTER_VIP/g" "$LOCAL_TEMPLATE"
sed -i "s/CLUSTER_PORT/$CLUSTER_PORT/g" "$LOCAL_TEMPLATE"
# 3个MASTER01_IP按顺序替换
sed -i "0,/MASTER01_IP/s/MASTER01_IP/$MASTER1_IP/" "$LOCAL_TEMPLATE"
sed -i "0,/MASTER01_IP/s/MASTER01_IP/$MASTER2_IP/" "$LOCAL_TEMPLATE"
sed -i "0,/MASTER01_IP/s/MASTER01_IP/$MASTER3_IP/" "$LOCAL_TEMPLATE"
# 替换CLUSTER_VIP:CLUSTER_PORT
local vip_port="${CLUSTER_VIP}:${CLUSTER_PORT}"
sed -i "s/CLUSTER_VIP:CLUSTER_PORT/$vip_port/g" "$LOCAL_TEMPLATE"
success "变量替换完成"
}
# 步骤3拷贝到目标服务器目标IP=local-ip
copy_to_remote() {
info "拷贝文件到目标服务器:$REMOTE_USER@$LOCALIP:$REMOTE_CONFIG_PATH"
# 远程创建目录
ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$LOCALIP" "mkdir -p $(dirname "$REMOTE_CONFIG_PATH")" || error "远程目录创建失败"
# SCP传输
scp -o StrictHostKeyChecking=no "$LOCAL_TEMPLATE" "$REMOTE_USER@$LOCALIP:$REMOTE_CONFIG_PATH" || error "文件传输失败"
# 校验
if ssh "$REMOTE_USER@$LOCALIP" "test -f $REMOTE_CONFIG_PATH"; then
success "文件拷贝成功"
else
error "远程文件不存在请检查SSH免密"
fi
}
# 步骤4远程执行命令拉取镜像等
execute_remote_commands() {
info "$LOCALIP执行远程命令..."
local remote_cmds=(
"kubeadm config images pull --config $REMOTE_CONFIG_PATH" # 拉取镜像
"echo '远程配置文件路径:$REMOTE_CONFIG_PATH'"
)
for cmd in "${remote_cmds[@]}"; do
info "执行:$cmd"
ssh "$REMOTE_USER@$LOCALIP" "$cmd" || error "远程命令执行失败"
done
success "远程命令执行完成"
}
# 步骤5清理本地文件
cleanup() {
info "清理本地临时文件"
rm -f "$LOCAL_TEMPLATE" || info "本地文件清理失败"
}
# ========================== 主流程 ==========================
main() {
parse_args "$@"
download_template
replace_variables
copy_to_remote
execute_remote_commands # 可注释跳过
cleanup
echo -e "\n${GREEN}========================================"
echo -e "部署完成!目标服务器:$LOCALIP"
echo -e "配置文件:$REMOTE_CONFIG_PATH"
echo -e "下一步:在$LOCALIP执行 kubeadm init/join"
echo -e "========================================"
}
main "$@"