#!/bin/bash set -e set -o pipefail # ================= 颜色与日志 ================= RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' 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"; } # ================= 参数与配置 ================= if [ -z "$1" ] ; then echo "========================================" log_error "缺少参数!" echo "用法: $0 <用户@主机名> " echo "示例: $0 zhengyu@minio1 minio minio123" echo "========================================" exit 1 fi # ================= 2. 参数检查 ================= if [ "$#" -ne 3 ]; then echo "========================================" log_error "参数数量错误!需要 3 个参数" echo "用法: $0 <用户@主机名> " echo "示例: $0 zhengyu@minio1 minio minio123" echo "========================================" exit 1 fi TARGET_NODE="$1" MINIO_ROOT_USER="$2" MINIO_ROOT_PASSWORD="$3" HOSTNAME=${TARGET_NODE#*@} # 路径配置 INSTALL_DIR="/usr/local/bin" CONFIG_DIR="/etc/minio" DATA_BASE="/mnt" # ================= 辅助函数 ================= run_ssh() { local NODE=$1 local CMD=$2 # 增加超时设置,防止网络卡顿导致脚本挂死 if ! ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR "${NODE}" "$CMD"; then log_error "SSH 执行失败: ${CMD}" return 1 fi } run_scp() { local SRC=$1 local DEST_NODE=$2 local DEST_PATH=$3 if ! scp -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR "${SRC}" "${DEST_NODE}:${DEST_PATH}"; then log_error "SCP 传输失败: ${SRC} -> ${DEST_NODE}:${DEST_PATH}" return 1 fi } # ================= 核心逻辑 ================= deploy_to_node() { local NODE=$1 local HNAME=${NODE#*@} log_step " 开始部署 MinIO 到节点: ${HNAME}" # 1. 创建 minio 用户和组 log_info " 创建系统用户 minio..." run_ssh "${NODE}" "sudo groupadd -r minio 2>/dev/null || true" run_ssh "${NODE}" "sudo useradd -r -g minio -s /bin/false -d /home/minio -m minio 2>/dev/null || true" # 2. 修正磁盘权限 (关键步骤:关联用户与已挂载的磁盘) log_info " 设置数据目录权限..." for i in 1 2 3 4; do local MOUNT_POINT="${DATA_BASE}/drive${i}" # 确保目录存在 (防止磁盘未挂载时脚本报错) run_ssh "${NODE}" "sudo mkdir -p ${MOUNT_POINT}" run_ssh "${NODE}" "sudo chown -R minio:minio ${MOUNT_POINT}" run_ssh "${NODE}" "sudo chmod -R 755 ${MOUNT_POINT}" done log_info "✅ 用户及权限设置完成" # 3. 分发文件 log_info " 分发二进制文件和服务配置..." # 检查本地文件 for file in minio mc minio.service; do if [ ! -f "$file" ]; then log_error "❌ 本地缺少必要文件: $file" log_error "请确保当前目录下存在: minio, mc, minio.service" exit 1 fi done run_scp "./minio" "${NODE}" "/tmp/minio" run_scp "./mc" "${NODE}" "/tmp/mc" run_scp "./minio.service" "${NODE}" "/tmp/minio.service" run_ssh "${NODE}" "sudo mv /tmp/minio ${INSTALL_DIR}/minio" run_ssh "${NODE}" "sudo mv /tmp/mc ${INSTALL_DIR}/mc" run_ssh "${NODE}" "sudo mv /tmp/minio.service /etc/systemd/system/minio.service" run_ssh "${NODE}" "sudo chown -R minio:minio ${INSTALL_DIR}/minio ${INSTALL_DIR}/mc" run_ssh "${NODE}" "sudo chmod +x ${INSTALL_DIR}/minio ${INSTALL_DIR}/mc" run_ssh "${NODE}" "sudo chown -R root:root /etc/systemd/system/minio.service" log_info "✅ 文件分发完成" # 4. 创建环境变量配置 log_info "⚙️ 创建配置文件 minio.env..." run_ssh "${NODE}" "sudo mkdir -p ${CONFIG_DIR}" # 注意:这里使用 http://minio{1...4} 是 MinIO 分布式模式的简写语法 # 依赖前置步骤中已配置好的 /etc/hosts 解析 run_ssh "${NODE}" "sudo tee ${CONFIG_DIR}/minio.env > /dev/null < /dev/null 2>&1; then log_info "✅ 节点 ${HNAME} 服务运行正常!" return 0 else log_error "❌ 节点 ${HNAME} 服务启动失败!" log_error ">>> 请登录节点运行: journalctl -u minio -n 50 --no-pager" return 1 fi } # ================= 主流程 ================= echo "========================================" log_step " MinIO 应用部署脚本" log_info " 目标节点: ${TARGET_NODE}" echo "========================================" if deploy_to_node "${TARGET_NODE}"; then echo "========================================" log_info " 节点 ${TARGET_NODE} 部署完成!" echo "----------------------------------------" log_info " 访问控制台: http://${HOSTNAME}:9001" log_info " 账号: ${MINIO_ROOT_USER}" log_info " 密码: ${MINIO_ROOT_PASSWORD}" echo "========================================" else log_error " 部署失败!" exit 1 fi