一键完成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、如果登入的时间,出现下面这个,需要把旧的默认管理员删除

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |