#!/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"; } # ================= 2. 参数检查 ================= if [ "$#" -ne 5 ]; then echo "========================================" log_error "参数数量错误!需要 4 个参数" echo "用法: $0 <用户@主机名> " echo "示例: $0 zhengyu@juicefs1 juicefsadmin juicefsadmin123 redis123 metadata1" echo "==================================================" exit 1 fi TARGET_NODE="$1" JUICEFS_USER="$2" JUICEFS_PASSWORD="$3" REDIS_PASSWORD="$4" METADATA="$5" HOSTNAME=${TARGET_NODE#*@} # 路径配置 INSTALL_DIR="/usr/local/bin" CONFIG_DIR="/etc/juicefs" JFS_CACHE_DIR="/var/juicefs_gateway_cache" # ================= 辅助函数 ================= 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 " 开始部署 Juicefs-Gateway 到节点: ${HNAME}" # 1. 创建 juicefs 用户和组 log_info " 创建系统用户 juicefs..." run_ssh "${NODE}" "sudo groupadd -r juicefs 2>/dev/null || true" run_ssh "${NODE}" "sudo useradd -r -g juicefs -s /bin/false -d /home/juicefs -m juicefs 2>/dev/null || true" # 2. 修正磁盘权限 (关键步骤:关联用户与已挂载的磁盘) log_info " 设置数据目录权限..." run_ssh "${NODE}" "sudo mkdir -p ${JFS_CACHE_DIR}" run_ssh "${NODE}" "sudo chown -R juicefs:juicefs ${JFS_CACHE_DIR}" run_ssh "${NODE}" "sudo chmod -R 755 ${JFS_CACHE_DIR}" log_info "✅ 用户及权限设置完成" # 3. 分发文件 log_info " 分发二进制文件和服务配置..." # 检查本地文件 for file in juicefs juicefs-gateway.service; do if [ ! -f "$file" ]; then log_error "❌ 本地缺少必要文件: $file" log_error "请确保当前目录下存在: juicefs juicefs-gateway.service.service" exit 1 fi done run_scp "./juicefs" "${NODE}" "/tmp/juicefs" run_scp "./juicefs-gateway.service" "${NODE}" "/tmp/juicefs-gateway.service" run_ssh "${NODE}" "sudo mv /tmp/juicefs ${INSTALL_DIR}/juicefs" run_ssh "${NODE}" "sudo mv /tmp/juicefs-gateway.service /etc/systemd/system/juicefs-gateway.service" run_ssh "${NODE}" "sudo chown -R juicefs:juicefs ${INSTALL_DIR}/juicefs" run_ssh "${NODE}" "sudo chmod +x ${INSTALL_DIR}/juicefs" run_ssh "${NODE}" "sudo chown -R root:root /etc/systemd/system/juicefs-gateway.service" log_info "✅ 文件分发完成" # 4. 创建环境变量配置 log_info "⚙️ 创建配置文件 juicefs.env..." run_ssh "${NODE}" "sudo mkdir -p ${CONFIG_DIR}" # 依赖前置步骤中已配置好的 /etc/hosts 解析 run_ssh "${NODE}" "sudo tee ${CONFIG_DIR}/juicefs.env > /dev/null < /dev/null 2>&1; then log_info "✅ 节点 ${HNAME} 服务运行正常!" return 0 else log_error "❌ 节点 ${HNAME} 服务启动失败!" log_error ">>> 请登录节点运行: journalctl -u juicefs -n 50 --no-pager" return 1 fi } # ================= 主流程 ================= echo "========================================" log_step " Juicefs 应用部署脚本" log_info " 目标节点: ${TARGET_NODE}" echo "========================================" if deploy_to_node "${TARGET_NODE}"; then echo "========================================" log_info " 节点 ${TARGET_NODE} 部署完成!" echo "----------------------------------------" echo "========================================" else log_error " 部署失败!" exit 1 fi