Windows版-RabbitMQ自动化部署

一键完成Erlang环境变量配置(ERLANG_HOME系统变量)‌

一键完成RabbitMQ环境变量配置(RabbitMQ系统变量)‌

实现快速安装部署RabbitMQ

PS:

需提前下载安装:

  • otp_win64_25.0.exe (Erlang)

  • rabbitmq-server-3.12.0.exe

自动化部署脚本(install_rabbitmq_v12.ps1)

bash 复制代码
<#
.SYNOPSIS
    RabbitMQ 全自动安装脚本 (Erlang 25.0 + RabbitMQ 3.12.0)
.DESCRIPTION
    功能特性:
    - 智能检测 Erlang/RabbitMQ 安装路径
    - 自动修复常见安装问题
    - 详细的日志记录和错误处理
    - 服务状态实时验证
	otp和rabbitmq的版本要适配,否则会安装失败
    需提前下载:
    - otp_win64_25.0.exe (Erlang)
    - rabbitmq-server-3.12.0.exe
.NOTES
    作者:zhencheng.zheng
    版本:3.0.1
    最后更新:2025-04-07


#>

#region 初始化配置
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
$installTimestamp = Get-Date -Format 'yyyyMMddHHmmss'
$logFile = "$env:TEMP\rabbitmq_install_$installTimestamp.log"

# 安装包路径配置
# 定义可能存在的安装包目录(按优先级排序)
$searchPaths = @(
    $PSScriptRoot,                # 脚本所在目录
    "C:\",                        # C盘根目录
    $env:TEMP,                    # 系统临时目录
    "D:\", "E:\" , "F:\"                 # 其他常见磁盘
)

# 要查找的文件名
$erlangPackage = "otp_win64_25.0.exe"
$rabbitmqPackage = "rabbitmq-server-3.12.0.exe"

# 动态查找文件函数
function Find-Installer {
    param (
        [string]$fileName
    )
    foreach ($path in $searchPaths) {
        $fullPath = Join-Path -Path $path -ChildPath $fileName
        if (Test-Path $fullPath) {
            return $fullPath
        }
    }
    throw "未找到 $fileName,请确认安装包已放置在以下位置之一:`n$($searchPaths -join "`n")"
}
# 获取安装包路径
$erlangInstaller = Find-Installer -fileName $erlangPackage
$rabbitmqInstaller = Find-Installer -fileName $rabbitmqPackage


# 日志函数
function Write-InstallLog {
    param([string]$message, [string]$level = "INFO")
    $logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') [$level] $message"
    $logEntry | Out-File $logFile -Append
    switch ($level) {
        "ERROR" { Write-Host $message -ForegroundColor Red }
        "WARN"  { Write-Host $message -ForegroundColor Yellow }
        default { Write-Host $message }
    }
}
#endregion

#region 核心功能函数
function Test-AdminPrivilege {
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = New-Object Security.Principal.WindowsPrincipal($identity)
    return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}

function Initialize-RabbitMQ {
    # RabbitMQ基础路径(自动适配版本号)
    $rabbitmqBase = "C:\Program Files\RabbitMQ Server"
    $version = "3.12.0"  # 可根据实际情况动态获取版本号
    
    # 标准化路径定义
    $configDir = Join-Path $rabbitmqBase "rabbitmq_server-$version\etc\rabbitmq"
    $logDir = Join-Path $rabbitmqBase "rabbitmq_server-$version\log"

    try {
        # 1. 创建配置目录(兼容新旧版本路径结构)
        if (-not (Test-Path $configDir)) {
            New-Item -Path $configDir -ItemType Directory -Force -ErrorAction Stop | Out-Null
            Write-Host "[✓] 配置目录已创建: $configDir" -ForegroundColor Green
        }

       

        # 3. 创建日志目录结构
        $logSubDirs = @("", "archive", "crash")
        $logSubDirs | ForEach-Object {
            $fullPath = Join-Path $logDir $_
            if (-not (Test-Path $fullPath)) {
                New-Item -Path $fullPath -ItemType Directory -Force | Out-Null
            }
        }

        # 4. 设置目录权限(确保服务账户有写入权限)
        $acl = Get-Acl $logDir
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
            "NT SERVICE\RabbitMQ", 
            "Modify", 
            "ContainerInherit,ObjectInherit", 
            "None", 
            "Allow"
        )
        $acl.AddAccessRule($rule)
        Set-Acl -Path $logDir -AclObject $acl

        Write-Host "[✓] RabbitMQ 初始化完成" -ForegroundColor Green
        Write-Host "    配置文件路径: $configDir\rabbitmq.conf"
        Write-Host "    日志目录路径: $logDir"
    }
    catch {
        Write-Host "[×] 初始化失败: $_" -ForegroundColor Red
        exit 1
    }
}

function Get-ErlangHome {
    # 多路径检测逻辑
    $searchPaths = @(
        "${env:ProgramFiles}\erl-*",
        "${env:ProgramFiles(x86)}\erl-*",
        "C:\Program Files\erl-*",
        "C:\Program Files (x86)\erl-*"
    )

    $erlangHome = $searchPaths | ForEach-Object {
        Get-ChildItem $_ -ErrorAction SilentlyContinue | 
        Where-Object { Test-Path "$($_.FullName)\bin\erl.exe" } |
        Sort-Object { [version]($_.Name -replace '^erl-') } -Descending |
        Select-Object -First 1 -ExpandProperty FullName
    } | Select-Object -First 1

    if (-not $erlangHome) {
        throw "无法自动检测 Erlang 安装路径,请手动检查安装"
    }
    return $erlangHome
}

function Repair-ServicePath {
    # 修复服务注册表路径
    try {
        $serviceRegPath = "HKLM:\SYSTEM\CurrentControlSet\Services\RabbitMQ"
        if (Test-Path $serviceRegPath) {
            $currentPath = (Get-ItemProperty $serviceRegPath).ImagePath
            $erlangBinPath = (Get-Item "$(Get-ErlangHome)\bin\erl.exe").FullName
            
            if ($currentPath -notmatch [regex]::Escape($erlangBinPath)) {
                $fixedPath = $currentPath -replace '.*?erl\.exe', $erlangBinPath
                Set-ItemProperty -Path $serviceRegPath -Name "ImagePath" -Value $fixedPath
                Write-InstallLog "✓ 服务路径已修复: $fixedPath"
            }
        }
    }
    catch {
        Write-InstallLog "⚠️ 服务路径修复失败: $_" -level "WARN"
    }
}
#endregion

#region 主安装流程
try {
    # 1. 管理员权限检查
   
	if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host "正在请求管理员权限..." -ForegroundColor Yellow
    
    # 自动识别 PowerShell 可执行文件路径
    $psExe = if (Get-Command pwsh.exe -ErrorAction SilentlyContinue) { 
        "pwsh.exe" 
    } else { 
        "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe" 
    }

    # 处理路径中的特殊字符
    $scriptPath = if ($PSCommandPath -match '\s') { 
        "`"$PSCommandPath`"" 
    } else { 
        $PSCommandPath 
    }

    try {
        Start-Process -FilePath $psExe -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File $scriptPath" -Verb RunAs -ErrorAction Stop
        exit
    } catch {
        Write-Host "❌ 提权失败: $_" -ForegroundColor Red
        Write-Host "请手动右键脚本,选择'以管理员身份运行'" -ForegroundColor Yellow
        pause
        exit 1
    }
}

    Write-InstallLog "=== RabbitMQ 自动化安装程序 ==="
    Write-InstallLog "开始时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
    Write-InstallLog "日志文件: $logFile"

    # 2. 安装包验证
    if (-not (Test-Path $erlangInstaller)) {
        throw "Erlang 安装包不存在: $erlangInstaller"
    }
    if (-not (Test-Path $rabbitmqInstaller)) {
        throw "RabbitMQ 安装包不存在: $rabbitmqInstaller"
    }

    # 3. 安装 Erlang
    Write-InstallLog "[1/4] 正在安装 Erlang..."
    $erlangArgs = @("/S", "/D=C:\Program Files\erl-25.0")
    $erlangProcess = Start-Process -FilePath $erlangInstaller -ArgumentList $erlangArgs -PassThru -Wait
    if ($erlangProcess.ExitCode -ne 0) {
        throw "Erlang 安装失败 (退出代码: $($erlangProcess.ExitCode))"
    }
    $erlangHome = Get-ErlangHome
    Write-InstallLog "✓ Erlang 安装成功: $erlangHome"

    # 4. 安装 RabbitMQ
    Write-InstallLog "[2/4] 正在安装 RabbitMQ..."
    $rabbitmqArgs = @("/S", "/D=C:\Program Files\RabbitMQ Server\rabbitmq_server-3.12.0")
    $rabbitmqProcess = Start-Process -FilePath $rabbitmqInstaller -ArgumentList $rabbitmqArgs -PassThru -Wait
    if ($rabbitmqProcess.ExitCode -ne 0) {
        throw "RabbitMQ 安装失败 (退出代码: $($rabbitmqProcess.ExitCode))"
    }
    $rabbitmqSbin = "C:\Program Files\RabbitMQ Server\rabbitmq_server-3.12.0\rabbitmq_server-3.12.0\sbin"
    Write-InstallLog "✓ RabbitMQ 安装成功: $rabbitmqSbin"

    # 5. 环境配置
    Write-InstallLog "[3/4] 正在配置环境变量..."
    [Environment]::SetEnvironmentVariable("ERLANG_HOME", $erlangHome, "Machine")
    $env:ERLANG_HOME = $erlangHome
    
    $currentPath = [Environment]::GetEnvironmentVariable("Path", "Machine") -split ';'
    $newPaths = @("$erlangHome\bin", $rabbitmqSbin) | Where-Object { $_ -notin $currentPath }
    if ($newPaths) {
        $updatedPath = ($currentPath + $newPaths) -join ';'
        [Environment]::SetEnvironmentVariable("Path", $updatedPath, "Machine")
        $env:Path = "$updatedPath;$env:Path"
    }

    # 6. 服务初始化
    Write-InstallLog "[4/4] 正在初始化服务..."
    Repair-ServicePath
    Initialize-RabbitMQ  # 新增配置初始化
    Push-Location $rabbitmqSbin
    try {
        Write-InstallLog "启用管理插件..."
        & .\rabbitmq-plugins.bat enable rabbitmq_management --offline
        if ($LASTEXITCODE -ne 0) { throw "插件启用失败" }

        Write-InstallLog "启动服务..."
        Start-Service RabbitMQ -ErrorAction Stop
        Set-Service RabbitMQ -StartupType Automatic

      Write-InstallLog "删除旧管理员账户..."
       & .\rabbitmqctl.bat delete_user admin -ErrorAction SilentlyContinue
	    & .\rabbitmqctl.bat delete_user guest -ErrorAction SilentlyContinue
    
        Write-InstallLog "创建管理员账户..."
        & .\rabbitmqctl.bat add_user admin123 123456
        & .\rabbitmqctl.bat set_user_tags admin administrator
        & .\rabbitmqctl.bat set_permissions -p / admin ".*" ".*" ".*"
    }
    finally {
        Pop-Location
    }

    # 7. 验证安装
    $service = Get-Service RabbitMQ -ErrorAction Stop
    if ($service.Status -ne "Running") {
        Start-Service RabbitMQ
        Start-Sleep -Seconds 3
    }

    Write-InstallLog "✓ 安装验证通过"
    Write-InstallLog "管理控制台: http://localhost:15672"
    Write-InstallLog "用户名: admin123 / 密码: 123456"
}
catch {
    Write-InstallLog "❌ 安装失败: $_" -level "ERROR"
    Write-InstallLog "错误详情: $($_.ScriptStackTrace)" -level "ERROR"
    
    # 尝试自动清理
    try {
        if (Get-Service RabbitMQ -ErrorAction SilentlyContinue) {
            Stop-Service RabbitMQ -Force -ErrorAction SilentlyContinue
        }
        Write-InstallLog "已执行服务清理"
    }
    catch {
        Write-InstallLog "⚠️ 清理失败: $_" -level "WARN"
    }
    
    exit 1
}
finally {
    Write-InstallLog "安装结束时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
    if (Test-Path $logFile) {
        Write-InstallLog "完整日志请查看: $logFile"
    }
}
#endregion

# 保持窗口打开
if ($Host.Name -match "consolehost") {
    Write-Host "`n按任意键继续..."
    $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}

执行上述脚本如果出现以下日志代表安装成功

遇见问题

1、如果登入的时候,出现下面这个,需要把旧的默认管理员删除

相关推荐
奋进的小暄23 分钟前
数据结构(java)栈与队列
java·开发语言·数据结构
笺上山河梦1 小时前
文件操作(二进制文件)
开发语言·c++·学习·算法
有杨既安然3 小时前
Python自动化办公
开发语言·人工智能·深度学习·机器学习
King.6244 小时前
从 SQL2API 到 Text2API:开启数据应用开发的新征程
大数据·开发语言·数据库·sql·低代码
奇谱4 小时前
Quipus,LightRag的Go版本的实现
开发语言·后端·语言模型·golang·知识图谱
Asthenia04124 小时前
ThreadLocal:介绍、与HashMap的对比及深入剖析
后端
小小菜鸟,可笑可笑4 小时前
Python 注释进阶之Google风格
开发语言·python
Asthenia04125 小时前
# 红黑树与二叉搜索树的区别及查找效率分析
后端
哲科软件5 小时前
2025年C#人力外包趋势与价值分析
开发语言·c#