我正在尝试创建一个powershell脚本,在新机器上安装RabbitMQ后设置用户“George”。
我无法弄清楚为什么这个脚本不起作用。
最后一步给了我404 {“错误”:“找不到对象”,“原因”:“\”未找到\“\ n”}
$secpasswd = ConvertTo-SecureString 'guest' -AsPlainText -Force
$credGuest = New-Object System.Management.Automation.PSCredential ('guest', $secpasswd)
$secpasswd2 = ConvertTo-SecureString 'george' -AsPlainText -Force
$credAdmin2 = New-Object System.Management.Automation.PSCredential ('george', $secpasswd2)
$body = @{
'password' = 'george'
'tags' = 'administrator'
} | ConvertTo-Json
$vhosts1 = ''
$vhosts1 = Invoke-RestMethod 'http://localhost:15672/api/users/george' -credential $credGuest -Method Put -ContentType "application/json" -Body $body
write '1:' $vhosts1
$vhosts2 = Invoke-RestMethod 'http://localhost:15672/api/permissions/%2f/' -Method get -credential $credAdmin2
write '2:' $vhosts2
$body2 = @{
'username' = 'george'
'vhost' = '/'
'configure' = '.*'
'write' = '.*'
'read' = '.*'
} | ConvertTo-Json
write '3:' $body2
$vhosts3 = Invoke-RestMethod 'http://localhost:15672/api/permissions/%2f/george' -credential $credGuest -Method Put -ContentType "application/json" -Body $body2
write '4:' $vhosts3
我也试过像这样格式化最后一步:
http://localhost:15672/api/permissions/george
相同的404错误。
我已经尝试了大约20,000种不同的方式发送命令。从完美匹配其他例子到尝试一些抽象艺术和伏都教魔法。在观看RabbitMQ的管理工具时,我可以看到George已经创建。而他有一个空虚的幽灵。所以前3个步骤完美无缺。
答案 0 :(得分:6)
好男人,你知道我爱你,因为我今晚之前从未听说过RabbitMQ。在过去的一小时里,我已经将它安装在我的Windows机器上,现在已经使用this awesome guide here to the API了解了它是如何工作的。
因此,当我一步一步地运行相同的过程时,我发现一切都在你所说的那样发生:
乔治被创造出来:
由于您的第二步是列出运行API调用的用户的当前权限,我接下来会看到来宾帐户的输出,该帐户具有完整的权限。然后转到步骤3,它为George建立目标权限。
username : george
write : .*
read : .*
configure : .*
vhost : /
从这里开始,步骤4.当我在上一步之后手动运行此步骤时...它可以正常工作!但是,如果我运行得太快,如果我立即运行整个脚本,我将收到404错误。似乎在RabbitMQ的幕后,需要稍微暂停以便用新用户更新文件。当我删除用户并再次尝试整个脚本时,我的每一步都得到了404,非常多。
但是,如果我添加一点Start-Sleep 5
来暂停5秒......
整个过程完成。添加暂停的关键位置是在步骤1之后,似乎需要大约四到五秒钟。
做得很漂亮
当然,我当然不能就此止步,所以我决定添加一些小的暂停来提高输出可读性,并确保每个操作都完成。我在步骤完成后添加了一些看待“OK”消息的purty,然后通过为当前用户执行最后一次API调用来添加权限的完成确认。
这是完成的输出
已完成的脚本
$secpasswd = ConvertTo-SecureString 'guest' -AsPlainText -Force
$credGuest = New-Object System.Management.Automation.PSCredential ('guest', $secpasswd)
$secpasswd2 = ConvertTo-SecureString 'stephen' -AsPlainText -Force
$credAdmin2 = New-Object System.Management.Automation.PSCredential ('stephen', $secpasswd2)
$body = @{
'password' = 'stephen'
'tags' = 'administrator'
} | ConvertTo-Json
Write-host "About to create new user $(($body | ConvertFrom-Json).Password)..." -NoNewline
$vhosts1 = Invoke-RestMethod 'http://localhost:15672/api/users/stephen' -credential $credGuest -Method Put -ContentType "application/json" -Body $body
start-sleep 5
Write-host "OK" -ForegroundColor Green
Start-Sleep -Milliseconds 400
Write-Host '1: Results:' $vhosts1
$body2 = @{
'username' = 'stephen'
'vhost' = '/'
'configure' = '.*'
'write' = '.*'
'read' = '.*'
} | ConvertTo-Json
Write-Output "Desired perms for new user $(($body | ConvertFrom-Json).Password)" $body2
Write-host "Setting perms for new user..." -NoNewline
$vhosts3 = Invoke-RestMethod 'http://localhost:15672/api/permissions/%2f/stephen' -credential $credGuest -Method Put -ContentType "application/json" -Body $body2
Start-sleep 5
Write-host "OK" -ForegroundColor Green
Start-Sleep -Milliseconds 400
write '4:' $vhosts3
'Retrieiving perms for new user to confirm...'
Invoke-RestMethod 'http://localhost:15672/api/permissions/%2f/stephen' -Method get -credential $credAdmin2
现在我希望我有机会再次使用RabbitMQ ......
答案 1 :(得分:0)
终于弄明了其他人为了与RabbitMQ api进行交互而编写的powershell库。
我发现某些版本的powershell在将它发送给兔子之前用/替换%2f。如果您使用此处的人员功能:
https://github.com/mariuszwojcik/RabbitMQTools
一切都运行得很漂亮。他放在一起真是太棒了。
答案 2 :(得分:0)
我迟到了这个问题。我也喜欢Powershell,但我使用.bat文件来运行本机RabbitMQ命令,如下所示。我需要添加一个用户,一个vhost,并将这两个挂起来。我想要一个脚本,所以任何新开发人员都可以运行它。
cd /D c:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.14\sbin
echo cd completed
call rabbitmqctl add_user bts mypass
call rabbitmqctl set_user_tags bts administrator
call rabbitmqctl add_vhost base
call rabbitmqctl set_permissions -p base bts ".*" ".*" ".*"
Echo ----List Command to confirm results --------
call rabbitmqctl list_vhosts
call rabbitmqctl list_user_permissions bts
我想你也可以从Powershell打电话给我们。我猜这个缺点是你必须在运行RabbitMQ的机器上。