#!/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,如192.168.61.10)" echo " --hostname <名称> 模板中替换的HOSTNAME(如master-01)" echo " --master1-ip 第1个MASTER01_IP替换值(如192.168.61.10)" echo " --master2-ip 第2个MASTER01_IP替换值(如192.168.61.11)" echo " --master3-ip 第3个MASTER01_IP替换值(如192.168.61.12)" echo " --cluster-vip 模板中替换的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 "$@"