#!/bin/bash # deploy_all.sh - 批量部署总控脚本(支持节点互信互通) set -o pipefail # ================= 颜色与日志 ================= RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } log_step() { echo -e "${BLUE}[STEP]${NC} $1"; } log_success() { echo -e "${CYAN}[OK]${NC} $1"; } # ================= 配置 ================= SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" HOST_FILE="${SCRIPT_DIR}/host_list.txt" SINGLE_SCRIPT="${SCRIPT_DIR}/1.1.deploy_keys_single.sh" # ================= 前置检查 ================= echo "========================================" echo -e "${CYAN} 批量节点初始化部署脚本${NC}" echo "========================================" if [ ! -f "$HOST_FILE" ]; then log_error "找不到主机列表文件:$HOST_FILE" exit 1 fi if [ ! -f "$SINGLE_SCRIPT" ]; then log_error "找不到单节点脚本:$SINGLE_SCRIPT" exit 1 fi chmod +x "$SINGLE_SCRIPT" log_info "主机列表:$HOST_FILE" log_info "单节点脚本:$SINGLE_SCRIPT" echo "" # ================= 解析主机列表 ================= log_step "解析主机列表..." declare -a NODE_NAMES declare -a NODE_IPS declare -a NODE_USERS declare -a NODE_PASSES COUNT=0 while IFS= read -r line || [[ -n "$line" ]]; do # 1. 跳过空行 [[ -z "${line// /}" ]] && continue # 2. 跳过注释行(带#号) [[ "$line" =~ ^[[:space:]]*# ]] && continue # 3. 跳过段落标记行(带[]) [[ "$line" =~ ^[[:space:]]*\[ ]] && continue # 4. 提取前 4 列(主机名、IP、用户名、密码) name=$(echo "$line" | awk '{print $1}') ip=$(echo "$line" | awk '{print $2}') user=$(echo "$line" | awk '{print $3}') pass=$(echo "$line" | awk '{print $4}') # 5. 验证字段完整性 if [ -z "$name" ] || [ -z "$ip" ] || [ -z "$user" ] || [ -z "$pass" ]; then log_warn "跳过格式错误的行:$line" continue fi # 6. 存入数组 NODE_NAMES+=("$name") NODE_IPS+=("$ip") NODE_USERS+=("$user") NODE_PASSES+=("$pass") ((COUNT++)) done < "$HOST_FILE" if [ $COUNT -eq 0 ]; then log_error "未找到有效的节点配置,请检查 $HOST_FILE 格式" exit 1 fi log_success "共解析到 $COUNT 个节点" echo "" # ================= 生成完整 Hosts 列表 ================= log_step "生成集群 Hosts 解析列表..." # 生成所有节点的 hosts 内容(供所有节点使用) CLUSTER_HOSTS="" for i in "${!NODE_NAMES[@]}"; do CLUSTER_HOSTS+="${NODE_IPS[$i]} ${NODE_NAMES[$i]}"$'\n' done # 保存到临时文件 HOSTS_TEMP_FILE="${SCRIPT_DIR}/.cluster_hosts_temp_$$" echo -n "$CLUSTER_HOSTS" > "$HOSTS_TEMP_FILE" log_success "Hosts 列表已生成(${#NODE_NAMES[@]} 条记录)" echo "" # ================= 显示节点列表 ================= log_warn "⚠️ 以下节点将被配置 SSH 密钥和免密 sudo:" echo "" printf " %-15s %-15s %-10s\n" "主机名" "IP 地址" "用户" echo " ------------------------------------------------" for i in "${!NODE_NAMES[@]}"; do printf " %-15s %-15s %-10s\n" "${NODE_NAMES[$i]}" "${NODE_IPS[$i]}" "${NODE_USERS[$i]}" done echo "" # ================= 显示 Hosts 解析内容 ================= log_warn " 所有节点将添加以下 Hosts 解析:" echo "" echo "$CLUSTER_HOSTS" # ================= 确认执行 ================= read -p "是否继续执行?(y/n): " confirm if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then log_info "操作已取消" rm -f "$HOSTS_TEMP_FILE" exit 0 fi echo "" log_step "开始批量部署..." echo "========================================" # ================= 批量部署 ================= TOTAL_NODES=$COUNT SUCCESS_COUNT=0 FAILED_COUNT=0 FAILED_LIST=() for i in "${!NODE_NAMES[@]}"; do name="${NODE_NAMES[$i]}" ip="${NODE_IPS[$i]}" user="${NODE_USERS[$i]}" pass="${NODE_PASSES[$i]}" log_step ">>> 部署节点:$name ($ip)" # 调用单节点脚本,传入 hosts 临时文件路径 if "$SINGLE_SCRIPT" "$name" "$ip" "$user" "$pass" "$HOSTS_TEMP_FILE" ; then log_success "✅ $name 部署成功" ((SUCCESS_COUNT++)) else log_error "❌ $name 部署失败" ((FAILED_COUNT++)) FAILED_LIST+=("$name ($ip)") fi echo "----------------------------------------" sleep 1 done # ================= 清理临时文件 ================= rm -f "$HOSTS_TEMP_FILE" # ================= 结果汇总 ================= echo "" echo "========================================" echo -e "${CYAN} 部署结果汇总${NC}" echo "========================================" echo "总节点数:$TOTAL_NODES" echo -e "成功: ${GREEN}$SUCCESS_COUNT${NC}" echo -e "失败: ${RED}$FAILED_COUNT${NC}" echo "========================================" if [ $FAILED_COUNT -gt 0 ]; then echo "" log_error "失败节点列表:" for failed in "${FAILED_LIST[@]}"; do echo " - $failed" done echo "" exit 1 else log_success " 所有节点部署完成!" log_info " 测试节点互通:" echo " ssh minio1 'ping -c 2 minio2'" echo " ssh minio2 'ping -c 2 metadata1'" exit 0 fi