#!/bin/bash # ================= 配置区域 ================= HOSTS_FILE="minio.txt" # =========================================== # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color 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_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } # 检查 minio.txt if [ ! -f "$HOSTS_FILE" ]; then log_error "找不到 $HOSTS_FILE 文件。" exit 1 fi # 二次确认 echo -e "${YELLOW}========================================${NC}" echo -e "${YELLOW} MinIO 无损卸载确认${NC}" echo -e "${YELLOW}========================================${NC}" echo "即将执行以下操作 (数据盘内容将保留,但不再挂载):" echo "1. 停止 MinIO 服务" echo "2. 删除 minio 和 mc 二进制文件" echo "3. 删除 systemd 服务文件" echo "4. 卸载 /mnt/drive* 目录" echo "5. 清理 /etc/fstab 中的挂载配置" echo "" echo -e "${RED}注意:磁盘数据不会被格式化,但服务将无法访问这些数据直到重新部署。${NC}" echo "" # 使用 -p 并确保从 /dev/tty 读取,防止被管道干扰 read -p "是否确定要继续?(输入 yes 确认): " CONFIRM < /dev/tty if [ "$CONFIRM" != "yes" ]; then log_info "操作已取消。" exit 0 fi # 【关键修复】使用进程替换 < <(...) 而不是管道 |,避免子 shell 问题 # 同时跳过标题行 while read -r HOSTNAME HOSTIP USER PASSWORD DEVICES; do # 跳过空行或注释 [[ -z "$HOSTNAME" || "$HOSTNAME" =~ ^# ]] && continue log_info "正在处理节点: $HOSTNAME ($HOSTIP) ..." # 构建 SSH 命令 # 【关键修复】添加 < /dev/null 防止 SSH 占用 stdin 导致循环中断 SSH_CMD="ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 -o BatchMode=yes $USER@$HOSTIP" # 测试连接 if ! $SSH_CMD "exit" < /dev/null 2>/dev/null; then log_error "无法通过 SSH 密钥连接到 $HOSTNAME ($HOSTIP)。请检查密钥配置或网络。" continue fi # 1. 停止服务 log_info " -> 停止 MinIO 服务..." $SSH_CMD "sudo systemctl stop minio.service 2>/dev/null || true" < /dev/null $SSH_CMD "sudo systemctl disable minio.service 2>/dev/null || true" < /dev/null # 2. 删除二进制文件 log_info " -> 删除二进制文件 (minio, mc)..." $SSH_CMD "sudo rm -f /usr/local/bin/minio /usr/local/bin/mc ~/minio ~/mc /etc/minio/minio.env 2>/dev/null || true" < /dev/null # 3. 删除 systemd 配置文件 log_info " -> 删除 systemd 配置..." $SSH_CMD "sudo rm -f /etc/systemd/system/minio.service 2>/dev/null || true" < /dev/null $SSH_CMD "sudo systemctl daemon-reload 2>/dev/null || true" < /dev/null # 4. 卸载磁盘 # 【关键修复】直接在远程执行明确的命令列表,避免 for 循环变量转义问题 log_info " -> 卸载数据盘..." $SSH_CMD "sudo umount /mnt/drive1 2>/dev/null || true; sudo umount /mnt/drive2 2>/dev/null || true; sudo umount /mnt/drive3 2>/dev/null || true; sudo umount /mnt/drive4 2>/dev/null || true; echo 'Done unmounting'" < /dev/null # 5. 清理 fstab log_info " -> 清理 /etc/fstab..." $SSH_CMD "sudo cp /etc/fstab /etc/fstab.bak.uninstall.\$(date +%F) 2>/dev/null || true" < /dev/null $SSH_CMD "sudo sed -i '/\/mnt\/drive/d' /etc/fstab" < /dev/null # 6. 清理残留配置目录 log_info " -> 清理 MinIO 配置目录..." $SSH_CMD "sudo rm -rf /opt/minio /var/lib/minio ~/.minio 2>/dev/null || true" < /dev/null log_success " ✅ 节点 $HOSTNAME 清理完成。" echo "----------------------------------------" done < <(tail -n +2 "$HOSTS_FILE") log_info "所有节点卸载流程结束。" log_warn "建议:如果后续要重新部署,请检查各节点 /mnt/drive* 目录下是否残留了 .minio.sys 等隐藏文件。"