一键完成Erlang环境变量配置(ERLANG_HOME系统变量)
一键完成RabbitMQ环境变量配置(RabbitMQ系统变量)
实现快速安装部署RabbitMQ
PS:
需提前下载安装:
- otp_win64_25.0.exe (Erlang)
- rabbitmq-server-3.12.0.exe
自动化部署脚本(install_rabbitmq_v12.ps1)
<#
.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、如果登入的时候,出现下面这个,需要把旧的默认管理员删除