Windows版-RabbitMQ自动化部署

news2025/4/14 13:01:55

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2330902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openEuler24.03 LTS下安装Flink

目录 Flink的安装模式下载Flink安装Local模式前提条件解压安装包启动集群查看进程提交作业文件WordCount持续流WordCount 查看Web UI配置flink-conf.yaml简单使用 关闭集群 Standalone Session模式前提条件Flink集群规划解压安装包配置flink配置flink-conf.yaml配置workers配置…

从零开始学java--泛型(1)

泛型 学生成绩可能是数字类型&#xff0c;也可能是字符串类型&#xff0c;如何存放可能出现的两种类型呢&#xff1a; public class Score {String name;String id;Object value; //因为Object是所有类型的父类&#xff0c;因此既可以存放Integer也能存放Stringpublic Score…

【正点原子】STM32MP135去除SD卡引脚复用,出现 /dev/mmcblk1p5 not found!

如果在设备树中直接注释掉 sdmmc1 节点&#xff0c;就会导致系统启动时识别不到真正的 eMMC 设备&#xff0c;进而挂载失败&#xff0c;爆出 /dev/mmcblk1p5 not found 的问题。 正点原子STM32MP135开发板Linux核心板嵌入式ARM双千兆以太网CAN 正确操作是“放空”而不是“删光…

CrystalDiskInfo电脑硬盘监控工具 v9.6.0中文绿色便携版

前言 CrystalDiskInfo是一个不用花钱的硬盘小帮手软件&#xff0c;它可以帮你看看你的电脑硬盘工作得怎么样&#xff0c;健不健康。这个软件能显示硬盘的温度高不高、还有多少地方没用、传输东西快不快等等好多信息。用了它&#xff0c;你就能很容易地知道硬盘现在是什么情况&…

详解模型蒸馏,破解DeepSeek性能谜题

大家好&#xff0c;不少关注 DeepSeek 最新动态的朋友&#xff0c;想必都遇到过 “Distillation”&#xff08;蒸馏&#xff09;这一术语。本文将介绍模型蒸馏技术的原理&#xff0c;同时借助 TensorFlow 框架中的实例进行详细演示。通过本文&#xff0c;对模型蒸馏有更深的认识…

园区网拓扑作业

作业要求&#xff1a; 需求&#xff1a; 需求分析&#xff1a; 1.按照图示的VLAN及IP地址需求&#xff0c;完成相关配需&#xff1a;VLAN 2、3、20、30 已分配子网&#xff0c;需在交换机上创建 VLAN 并配置三层接口作为网关。确保各 VLAN 内设备能互通&#xff0c;跨 VLAN 通…

隔行换色总结

功能效果展示&#xff1a; 第一种思路&#xff1a; 使用数组&#xff0c;将数组的内容渲染到页面上&#xff0c;序号也就是将数组的下标输出到第一个td上&#xff0c;将数组的内容输出到第二个td上&#xff0c;&#xff08;使用拼接字符串&#xff09; 具体操作&#xff1a; …

使用Docker Desktop进行本地打包和推送

使用Docker Desktop进行本地打包和推送 一、Docker Desktop配置二、IDEA配置1.下载Docker插件2.在“Settings”中&#xff0c;配置“Docker”3.选择“Docker Registry”&#xff0c;配置远程仓库。 三、POM配置 一共有三个地方需要配置 一、Docker Desktop配置 在Docker Deskt…

Redis主从复制:告别单身Redis!

目录 一、 为什么需要主从复制&#xff1f;&#x1f914;二、 如何搭建主从架构&#xff1f;前提条件✅步骤&#x1f4c1; 创建工作目录&#x1f4dc; 创建 Docker Compose 配置文件&#x1f680; 启动所有 Redis&#x1f50d; 验证主从状态 &#x1f4a1; 重要提示和后续改进 …

ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、级联查询案例、resultMap映射

DAY21.1 Java核心基础 ORM Object Relationship Mapping 对象关系映射 面向对象的程序到—关系型数据库的映射 比如java – MySQL的映射 ORM框架就是实现这个映射的框架 Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC Spring Data JPA的底层就是Hiber…

C#调用Lua方法1+C#调用Lua方法2,3

xLua中Lua调用C#代码 原因&#xff1a;C#实现的系统&#xff0c;因为Lua可以调用&#xff0c;所以完全可以换成Lua实现&#xff0c;因为Lua可以即时更改&#xff0c;即时运行&#xff0c;所以游戏的代码逻辑就可以随时更改。 实现和C#相同效果的系统&#xff0c;如何实现&#…

NO.77十六届蓝桥杯备战|数据结构-单调队列|质量检测(C++)

什么是单调队列&#xff1f; 单调队列&#xff0c;顾名思义&#xff0c;就是存储的元素要么单调递增要么单调递减的队列。注意&#xff0c;这⾥的队列和普通的队列不⼀样&#xff0c;是⼀个双端队列。单调队列解决的问题 ⼀般⽤于解决滑动窗⼝内最⼤值最⼩值问题&#xff0c;以…

通过发票四要素信息核验增值税发票真伪-iOS发票查验接口

发票是企业经济间往来的重要凭证&#xff0c;现如今&#xff0c;随着经济环境的日益复杂&#xff0c;发票造假现象屡禁不止&#xff0c;这使得增值税发票查验成为企业必须高度重视的工作。人工智能时代&#xff0c;发票查验接口犹如一道坚固的防线&#xff0c;助力企业财务守护…

【JAVA】十、基础知识“类和对象”干货分享~(三)

目录 1. 封装 1.1 封装的概念 1.2 访问限定符 public&#xff08;公开访问&#xff09; private&#xff08;私有访问&#xff09; 1.3 包 1.3.1 包的概念 1.3.2 导入包中的类 1.3.3 自定义包 2. static成员 2.1 static变量&#xff08;类变量&#xff09; 2.1.1 sta…

DeepSeek+SpringAI家庭AI医生

文章目录 项目架构项目开发内容项目用户用例图项目地址开发环境大模型使用本地&#xff1a;Ollama部署DeepSeek离线与在线api大模型客户端使用 数据库脚本代码deepseek创建定制医生模型 内网互通原则云服务器类型 项目架构 项目开发内容 项目用户用例图 项目地址 FamilyAIDoct…

PyTorch:解锁AI新时代的钥匙

&#xff08;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff09;。 揭开PyTorch面纱 对于许多刚开始接触人工智能领域的朋友来说&#xff0c;PyTorch这个名字或许既熟悉又陌生。…

C++第14届蓝桥杯b组学习笔记

1. 日期统计 小蓝现在有一个长度为 100100 的数组&#xff0c;数组中的每个元素的值都在 00 到 99 的范围之内。数组中的元素从左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4…

解锁工业通信:Profibus DP到ModbusTCP网关指南!

解锁工业通信&#xff1a;Profibus DP到ModbusTCP网关指南&#xff01; 在工业自动化领域&#xff0c;随着技术的不断进步和应用场景的日益复杂&#xff0c;不同设备和系统之间的通讯协议兼容性问题成为了工程师们面临的一大挑战。尤其是在Profibus DP和Modbus/TCP这两种广泛应…

每日一题(小白)字符串娱乐篇16

分析题意可以了解到本题要求在一串字符串中找到所有组合起来排序递增的字符串。我们可以默认所有字符在字符串中的上升序列是1&#xff0c;从第一个字符开始找&#xff0c;如果后面的字符大于前面的字符就说明这是一个上序列那么后面字符所在的数组加一&#xff0c;如果连接不上…

如何深刻理解Reactor和Proactor

前言&#xff1a; 网络框架的设计离不开 I/O 线程模型&#xff0c;线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。目前主流的网络框架&#xff0c;在网络 IO 处理层面几乎都采用了I/O 多路复用方案(又以epoll为主)&#xff0c;这是服务端应对高并发的性能利器。 …