Windows版-RabbitMQ自动化部署

打印 上一主题 下一主题

主题 1873|帖子 1873|积分 5619

一键完成Erlang环境变量配置(ERLANG_HOME系统变量)‌
一键完成RabbitMQ环境变量配置(RabbitMQ系统变量)‌
实现快速安装部署RabbitMQ
   PS:
  需提前下载安装:
    - otp_win64_25.0.exe (Erlang)
    - rabbitmq-server-3.12.0.exe
  自动化部署脚本(install_rabbitmq_v12.ps1)
  1. <#
  2. .SYNOPSIS
  3.     RabbitMQ 全自动安装脚本 (Erlang 25.0 + RabbitMQ 3.12.0)
  4. .DESCRIPTION
  5.     功能特性:
  6.     - 智能检测 Erlang/RabbitMQ 安装路径
  7.     - 自动修复常见安装问题
  8.     - 详细的日志记录和错误处理
  9.     - 服务状态实时验证
  10.         otp和rabbitmq的版本要适配,否则会安装失败
  11.     需提前下载:
  12.     - otp_win64_25.0.exe (Erlang)
  13.     - rabbitmq-server-3.12.0.exe
  14. .NOTES
  15.     作者:zhencheng.zheng
  16.     版本:3.0.1
  17.     最后更新:2025-04-07
  18. #>
  19. #region 初始化配置
  20. $ErrorActionPreference = 'Stop'
  21. $ProgressPreference = 'SilentlyContinue'
  22. $installTimestamp = Get-Date -Format 'yyyyMMddHHmmss'
  23. $logFile = "$env:TEMP\rabbitmq_install_$installTimestamp.log"
  24. # 安装包路径配置
  25. # 定义可能存在的安装包目录(按优先级排序)
  26. $searchPaths = @(
  27.     $PSScriptRoot,                # 脚本所在目录
  28.     "C:",                        # C盘根目录
  29.     $env:TEMP,                    # 系统临时目录
  30.     "D:", "E:" , "F:"                 # 其他常见磁盘
  31. )
  32. # 要查找的文件名
  33. $erlangPackage = "otp_win64_25.0.exe"
  34. $rabbitmqPackage = "rabbitmq-server-3.12.0.exe"
  35. # 动态查找文件函数
  36. function Find-Installer {
  37.     param (
  38.         [string]$fileName
  39.     )
  40.     foreach ($path in $searchPaths) {
  41.         $fullPath = Join-Path -Path $path -ChildPath $fileName
  42.         if (Test-Path $fullPath) {
  43.             return $fullPath
  44.         }
  45.     }
  46.     throw "未找到 $fileName,请确认安装包已放置在以下位置之一:`n$($searchPaths -join "`n")"
  47. }
  48. # 获取安装包路径
  49. $erlangInstaller = Find-Installer -fileName $erlangPackage
  50. $rabbitmqInstaller = Find-Installer -fileName $rabbitmqPackage
  51. # 日志函数
  52. function Write-InstallLog {
  53.     param([string]$message, [string]$level = "INFO")
  54.     $logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') [$level] $message"
  55.     $logEntry | Out-File $logFile -Append
  56.     switch ($level) {
  57.         "ERROR" { Write-Host $message -ForegroundColor Red }
  58.         "WARN"  { Write-Host $message -ForegroundColor Yellow }
  59.         default { Write-Host $message }
  60.     }
  61. }
  62. #endregion
  63. #region 核心功能函数
  64. function Test-AdminPrivilege {
  65.     $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
  66.     $principal = New-Object Security.Principal.WindowsPrincipal($identity)
  67.     return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
  68. }
  69. function Initialize-RabbitMQ {
  70.     # RabbitMQ基础路径(自动适配版本号)
  71.     $rabbitmqBase = "C:\Program Files\RabbitMQ Server"
  72.     $version = "3.12.0"  # 可根据实际情况动态获取版本号
  73.    
  74.     # 标准化路径定义
  75.     $configDir = Join-Path $rabbitmqBase "rabbitmq_server-$version\etc\rabbitmq"
  76.     $logDir = Join-Path $rabbitmqBase "rabbitmq_server-$version\log"
  77.     try {
  78.         # 1. 创建配置目录(兼容新旧版本路径结构)
  79.         if (-not (Test-Path $configDir)) {
  80.             New-Item -Path $configDir -ItemType Directory -Force -ErrorAction Stop | Out-Null
  81.             Write-Host "[✓] 配置目录已创建: $configDir" -ForegroundColor Green
  82.         }
  83.       
  84.         # 3. 创建日志目录结构
  85.         $logSubDirs = @("", "archive", "crash")
  86.         $logSubDirs | ForEach-Object {
  87.             $fullPath = Join-Path $logDir $_
  88.             if (-not (Test-Path $fullPath)) {
  89.                 New-Item -Path $fullPath -ItemType Directory -Force | Out-Null
  90.             }
  91.         }
  92.         # 4. 设置目录权限(确保服务账户有写入权限)
  93.         $acl = Get-Acl $logDir
  94.         $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
  95.             "NT SERVICE\RabbitMQ",
  96.             "Modify",
  97.             "ContainerInherit,ObjectInherit",
  98.             "None",
  99.             "Allow"
  100.         )
  101.         $acl.AddAccessRule($rule)
  102.         Set-Acl -Path $logDir -AclObject $acl
  103.         Write-Host "[✓] RabbitMQ 初始化完成" -ForegroundColor Green
  104.         Write-Host "    配置文件路径: $configDir\rabbitmq.conf"
  105.         Write-Host "    日志目录路径: $logDir"
  106.     }
  107.     catch {
  108.         Write-Host "[×] 初始化失败: $_" -ForegroundColor Red
  109.         exit 1
  110.     }
  111. }
  112. function Get-ErlangHome {
  113.     # 多路径检测逻辑
  114.     $searchPaths = @(
  115.         "${env:ProgramFiles}\erl-*",
  116.         "${env:ProgramFiles(x86)}\erl-*",
  117.         "C:\Program Files\erl-*",
  118.         "C:\Program Files (x86)\erl-*"
  119.     )
  120.     $erlangHome = $searchPaths | ForEach-Object {
  121.         Get-ChildItem $_ -ErrorAction SilentlyContinue |
  122.         Where-Object { Test-Path "$($_.FullName)\bin\erl.exe" } |
  123.         Sort-Object { [version]($_.Name -replace '^erl-') } -Descending |
  124.         Select-Object -First 1 -ExpandProperty FullName
  125.     } | Select-Object -First 1
  126.     if (-not $erlangHome) {
  127.         throw "无法自动检测 Erlang 安装路径,请手动检查安装"
  128.     }
  129.     return $erlangHome
  130. }
  131. function Repair-ServicePath {
  132.     # 修复服务注册表路径
  133.     try {
  134.         $serviceRegPath = "HKLM:\SYSTEM\CurrentControlSet\Services\RabbitMQ"
  135.         if (Test-Path $serviceRegPath) {
  136.             $currentPath = (Get-ItemProperty $serviceRegPath).ImagePath
  137.             $erlangBinPath = (Get-Item "$(Get-ErlangHome)\bin\erl.exe").FullName
  138.             
  139.             if ($currentPath -notmatch [regex]::Escape($erlangBinPath)) {
  140.                 $fixedPath = $currentPath -replace '.*?erl\.exe', $erlangBinPath
  141.                 Set-ItemProperty -Path $serviceRegPath -Name "ImagePath" -Value $fixedPath
  142.                 Write-InstallLog "✓ 服务路径已修复: $fixedPath"
  143.             }
  144.         }
  145.     }
  146.     catch {
  147.         Write-InstallLog "⚠️ 服务路径修复失败: $_" -level "WARN"
  148.     }
  149. }
  150. #endregion
  151. #region 主安装流程
  152. try {
  153.     # 1. 管理员权限检查
  154.    
  155.         if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
  156.     Write-Host "正在请求管理员权限..." -ForegroundColor Yellow
  157.    
  158.     # 自动识别 PowerShell 可执行文件路径
  159.     $psExe = if (Get-Command pwsh.exe -ErrorAction SilentlyContinue) {
  160.         "pwsh.exe"
  161.     } else {
  162.         "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe"
  163.     }
  164.     # 处理路径中的特殊字符
  165.     $scriptPath = if ($PSCommandPath -match '\s') {
  166.         "`"$PSCommandPath`""
  167.     } else {
  168.         $PSCommandPath
  169.     }
  170.     try {
  171.         Start-Process -FilePath $psExe -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File $scriptPath" -Verb RunAs -ErrorAction Stop
  172.         exit
  173.     } catch {
  174.         Write-Host "❌ 提权失败: $_" -ForegroundColor Red
  175.         Write-Host "请手动右键脚本,选择'以管理员身份运行'" -ForegroundColor Yellow
  176.         pause
  177.         exit 1
  178.     }
  179. }
  180.     Write-InstallLog "=== RabbitMQ 自动化安装程序 ==="
  181.     Write-InstallLog "开始时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
  182.     Write-InstallLog "日志文件: $logFile"
  183.     # 2. 安装包验证
  184.     if (-not (Test-Path $erlangInstaller)) {
  185.         throw "Erlang 安装包不存在: $erlangInstaller"
  186.     }
  187.     if (-not (Test-Path $rabbitmqInstaller)) {
  188.         throw "RabbitMQ 安装包不存在: $rabbitmqInstaller"
  189.     }
  190.     # 3. 安装 Erlang
  191.     Write-InstallLog "[1/4] 正在安装 Erlang..."
  192.     $erlangArgs = @("/S", "/D=C:\Program Files\erl-25.0")
  193.     $erlangProcess = Start-Process -FilePath $erlangInstaller -ArgumentList $erlangArgs -PassThru -Wait
  194.     if ($erlangProcess.ExitCode -ne 0) {
  195.         throw "Erlang 安装失败 (退出代码: $($erlangProcess.ExitCode))"
  196.     }
  197.     $erlangHome = Get-ErlangHome
  198.     Write-InstallLog "✓ Erlang 安装成功: $erlangHome"
  199.     # 4. 安装 RabbitMQ
  200.     Write-InstallLog "[2/4] 正在安装 RabbitMQ..."
  201.     $rabbitmqArgs = @("/S", "/D=C:\Program Files\RabbitMQ Server\rabbitmq_server-3.12.0")
  202.     $rabbitmqProcess = Start-Process -FilePath $rabbitmqInstaller -ArgumentList $rabbitmqArgs -PassThru -Wait
  203.     if ($rabbitmqProcess.ExitCode -ne 0) {
  204.         throw "RabbitMQ 安装失败 (退出代码: $($rabbitmqProcess.ExitCode))"
  205.     }
  206.     $rabbitmqSbin = "C:\Program Files\RabbitMQ Server\rabbitmq_server-3.12.0\rabbitmq_server-3.12.0\sbin"
  207.     Write-InstallLog "✓ RabbitMQ 安装成功: $rabbitmqSbin"
  208.     # 5. 环境配置
  209.     Write-InstallLog "[3/4] 正在配置环境变量..."
  210.     [Environment]::SetEnvironmentVariable("ERLANG_HOME", $erlangHome, "Machine")
  211.     $env:ERLANG_HOME = $erlangHome
  212.    
  213.     $currentPath = [Environment]::GetEnvironmentVariable("Path", "Machine") -split ';'
  214.     $newPaths = @("$erlangHome\bin", $rabbitmqSbin) | Where-Object { $_ -notin $currentPath }
  215.     if ($newPaths) {
  216.         $updatedPath = ($currentPath + $newPaths) -join ';'
  217.         [Environment]::SetEnvironmentVariable("Path", $updatedPath, "Machine")
  218.         $env:Path = "$updatedPath;$env:Path"
  219.     }
  220.     # 6. 服务初始化
  221.     Write-InstallLog "[4/4] 正在初始化服务..."
  222.     Repair-ServicePath
  223.     Initialize-RabbitMQ  # 新增配置初始化
  224.     Push-Location $rabbitmqSbin
  225.     try {
  226.         Write-InstallLog "启用管理插件..."
  227.         & .\rabbitmq-plugins.bat enable rabbitmq_management --offline
  228.         if ($LASTEXITCODE -ne 0) { throw "插件启用失败" }
  229.         Write-InstallLog "启动服务..."
  230.         Start-Service RabbitMQ -ErrorAction Stop
  231.         Set-Service RabbitMQ -StartupType Automatic
  232.       Write-InstallLog "删除旧管理员账户..."
  233.        & .\rabbitmqctl.bat delete_user admin -ErrorAction SilentlyContinue
  234.             & .\rabbitmqctl.bat delete_user guest -ErrorAction SilentlyContinue
  235.    
  236.         Write-InstallLog "创建管理员账户..."
  237.         & .\rabbitmqctl.bat add_user admin123 123456
  238.         & .\rabbitmqctl.bat set_user_tags admin administrator
  239.         & .\rabbitmqctl.bat set_permissions -p / admin ".*" ".*" ".*"
  240.     }
  241.     finally {
  242.         Pop-Location
  243.     }
  244.     # 7. 验证安装
  245.     $service = Get-Service RabbitMQ -ErrorAction Stop
  246.     if ($service.Status -ne "Running") {
  247.         Start-Service RabbitMQ
  248.         Start-Sleep -Seconds 3
  249.     }
  250.     Write-InstallLog "✓ 安装验证通过"
  251.     Write-InstallLog "管理控制台: http://localhost:15672"
  252.     Write-InstallLog "用户名: admin123 / 密码: 123456"
  253. }
  254. catch {
  255.     Write-InstallLog "❌ 安装失败: $_" -level "ERROR"
  256.     Write-InstallLog "错误详情: $($_.ScriptStackTrace)" -level "ERROR"
  257.    
  258.     # 尝试自动清理
  259.     try {
  260.         if (Get-Service RabbitMQ -ErrorAction SilentlyContinue) {
  261.             Stop-Service RabbitMQ -Force -ErrorAction SilentlyContinue
  262.         }
  263.         Write-InstallLog "已执行服务清理"
  264.     }
  265.     catch {
  266.         Write-InstallLog "⚠️ 清理失败: $_" -level "WARN"
  267.     }
  268.    
  269.     exit 1
  270. }
  271. finally {
  272.     Write-InstallLog "安装结束时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
  273.     if (Test-Path $logFile) {
  274.         Write-InstallLog "完整日志请查看: $logFile"
  275.     }
  276. }
  277. #endregion
  278. # 保持窗口打开
  279. if ($Host.Name -match "consolehost") {
  280.     Write-Host "`n按任意键继续..."
  281.     $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  282. }
复制代码
执行上述脚本如果出现以下日志代表安装成功


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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表