一键完成Erlang环境变量配置(ERLANG_HOME系统变量)
一键完成RabbitMQ环境变量配置(RabbitMQ系统变量)
实现快速安装部署RabbitMQ
PS:
需提前下载安装:
- otp_win64_25.0.exe (Erlang)
- rabbitmq-server-3.12.0.exe
自动化部署脚本(install_rabbitmq_v12.ps1)
<#
.SYNOPSISRabbitMQ 全自动安装脚本 (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 $fileNameif (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 -Appendswitch ($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-NullWrite-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 $aclWrite-Host "[✓] RabbitMQ 初始化完成" -ForegroundColor GreenWrite-Host " 配置文件路径: $configDir\rabbitmq.conf"Write-Host " 日志目录路径: $logDir"}catch {Write-Host "[×] 初始化失败: $_" -ForegroundColor Redexit 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 1if (-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").FullNameif ($currentPath -notmatch [regex]::Escape($erlangBinPath)) {$fixedPath = $currentPath -replace '.*?erl\.exe', $erlangBinPathSet-ItemProperty -Path $serviceRegPath -Name "ImagePath" -Value $fixedPathWrite-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 Stopexit} catch {Write-Host "❌ 提权失败: $_" -ForegroundColor RedWrite-Host "请手动右键脚本,选择'以管理员身份运行'" -ForegroundColor Yellowpauseexit 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. 安装 ErlangWrite-InstallLog "[1/4] 正在安装 Erlang..."$erlangArgs = @("/S", "/D=C:\Program Files\erl-25.0")$erlangProcess = Start-Process -FilePath $erlangInstaller -ArgumentList $erlangArgs -PassThru -Waitif ($erlangProcess.ExitCode -ne 0) {throw "Erlang 安装失败 (退出代码: $($erlangProcess.ExitCode))"}$erlangHome = Get-ErlangHomeWrite-InstallLog "✓ Erlang 安装成功: $erlangHome"# 4. 安装 RabbitMQWrite-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 -Waitif ($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-ServicePathInitialize-RabbitMQ # 新增配置初始化Push-Location $rabbitmqSbintry {Write-InstallLog "启用管理插件..."& .\rabbitmq-plugins.bat enable rabbitmq_management --offlineif ($LASTEXITCODE -ne 0) { throw "插件启用失败" }Write-InstallLog "启动服务..."Start-Service RabbitMQ -ErrorAction StopSet-Service RabbitMQ -StartupType AutomaticWrite-InstallLog "删除旧管理员账户..."& .\rabbitmqctl.bat delete_user admin -ErrorAction SilentlyContinue& .\rabbitmqctl.bat delete_user guest -ErrorAction SilentlyContinueWrite-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 Stopif ($service.Status -ne "Running") {Start-Service RabbitMQStart-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、如果登入的时候,出现下面这个,需要把旧的默认管理员删除