As I haven’t yet had the time to set up a proper devops deployment pipeline from my development RabbitMQ to UAT and then to production (don’t yell at me, I know, I’ll get to it… eventually), I find myself comparing instances in order not to forget adding a queue or an exchange.
So I wrote this script, that produces a diff-friendly text file that I can use to compare instances and see what’s missing:
#
# Source: DotJim blog (https://dandraka.com)
# Jim Andrakakis, April 2023
#
# ===== Parameters =====
param(
[string]$rqServer = 'http://myServer:15672', # better use HTTPS though
[string]$rqVhostName = 'myVhost',
[string]$rqUsername = 'myUsername', # this user needs at least 'Management' permissions to post to the REST API
[string]$rqPassword = 'myPassword',
[string]$outDir = 'C:\temp'
)
# ======================
Clear-Host
$ErrorActionPreference = 'Stop'
$WarningPreference = 'Continue'
$plainCredentials = "$($rqUsername):$($rqPassword)"
$encodedCredentials = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($plainCredentials))
$authHeader = "Basic " + $encodedCredentials
[string]$rqUrlQueues = "$rqServer/api/queues/$rqVhostName/"
[string]$rqUrlExchanges = "$rqServer/api/exchanges/$rqVhostName/"
[string]$filename = [System.IO.Path]::Combine($outDir, [guid]::NewGuid().ToString().Split('-')[0] + ".txt")
Out-File -FilePath $filename -Encoding utf8 -Append -InputObject "Server : $rqServer"
Out-File -FilePath $filename -Encoding utf8 -Append -InputObject "VHost : $rqVhostName"
$respQueues = Invoke-WebRequest -Method Get -Uri $rqUrlQueues -Headers @{'Authorization'= $authHeader}
$respExchanges = Invoke-WebRequest -Method Get -Uri $rqUrlExchanges -Headers @{'Authorization'= $authHeader}
$queuesJson = ConvertFrom-Json $respQueues.Content
$queuesJson | Sort-Object -Property name | % { Out-File -FilePath $filename -Encoding utf8 -Append -InputObject "Queue : $($_.name)" }
$exchangesJson = ConvertFrom-Json $respExchanges.Content
$exchangesJson | Sort-Object -Property name | % { Out-File -FilePath $filename -Encoding utf8 -Append -InputObject "Exchange : $($_.name)" }
Write-Host "Finished, output written to $filename"