检索服务总线事件中心连接字符串
Retrieve Service Bus event hub connection string
我有一个现有的服务总线,其中包含一个队列和使用 Azure 资源管理器部署的事件中心。
现在我有兴趣在不使用 ServiceBus.dll 的情况下使用 Azure PowerShell 检索主键和连接字符串。可能吗??
作为解决方法,我创建了一个 ARM 模板,它不部署任何东西,只是查询现有资源并检索我需要的信息。以下模板检索特定服务总线命名空间
的事件 hub/queue 的连接字符串和主键
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"serviceBusNamespace": {
"type": "string",
"minLength": 1,
"metadata": {
"description": "The name of the service bus namespace to create."
}
},
"resourceName": {
"type": "string",
"minLength": 1,
"metadata": {
"description": "The name of the resource to be retreived."
}
},
"resourceType": {
"type": "string",
"minLength": 1,
"allowedValues": [
"queues",
"eventhubs"
],
"metadata": {
"description": "The type of the resource"
}
},
"policy": {
"type": "string",
"minLength": 1,
"defaultValue": "ManagePolicy",
"allowedValues": [
"ManagePolicy",
"SendPolicy",
"ListenPolicy"
],
"metadata": {
"description": "The type of the resource"
}
}
},
"variables": {
},
"resources": [ ],
"outputs": {
"connectionString": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/',parameters('resourceType'),'/authorizationRules'),parameters('serviceBusNamespace'),parameters('resourceName'),parameters('policy')),'2015-08-01').primaryConnectionString]"
},
"primaryKey": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/',parameters('resourceType'),'/authorizationRules'),parameters('serviceBusNamespace'),parameters('resourceName'),parameters('policy')),'2015-08-01').primaryKey]"
}
}
}
是否滥用 ARM 模板来查询 资源而不实际部署任何东西?
编辑
要在 PowerShell 中捕获 ARM 模板的输出,请使用以下代码
$ep = New-AzureRmResourceGroupDeployment -Name "getEventHub" -ResourceGroupName myResourceGroup -Mode Incremental -TemplateFile getEventHub.json -TemplateParameterFile getEventHub.param.json
$RuleConnString = $ep.Outputs.connectionString.value
$RulePrimaryKey = $ep.Outputs.primaryKey.value
请注意 属性 名称 connectionString 和 primaryKey 与我的模板文件中定义的相同
编辑 2
如果我重新运行 ARM 模板来第二次部署事件中心,我会收到以下错误。
除了使用 ARM 模板查询详细信息外,我没有找到任何选项。
我看不出你做的有什么问题。在我看来,资源管理器模板本质上是增量的。因此,您可以编写一个模板来创建具有相同资源的现有服务总线。如果属性相同,那么它将保持现有资源不变,并且 return 您是相关资源的连接字符串和主键。
我需要自动创建服务总线和队列并分离 send/listen 共享访问策略。您可以通过使用 Get-AzureSBAuthorizationRule 本机使用 PowerShell 在服务总线本身上检索连接字符串,而无需使用 .Net ServiceBus.dll 程序集,但由于当前仍然存在错误,这在队列级别不起作用。
我尝试使用 ServiceBus.dll 创建共享访问策略,但有时它会 运行 完全失败,但如果您随后立即 运行 第二次创建它,它随后会工作。我也尝试过资源管理器模板,但之前你必须传入你自己生成的密钥。现在我看到 Microsoft 为你生成了这些,但你仍然试图以自动化方式获取密钥,所以我喜欢你的解决方案。
但有一个问题,您是否可以捕获资源管理器模板输出并将它们传回 PowerShell 脚本,您知道吗?
干杯
罗布
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": {
"servicebusNamespace": {
"type": "string",
"metadata": {
"description": "The service bus namespace"
}
},
"notificationssmsqueue": {
"type": "string",
"metadata": {
"description": "Notifications SMS queue"
}
} }, "variables": {
"location": "[resourceGroup().location]", }, "resources": [
{
"apiVersion": "2015-08-01",
"name": "[parameters('servicebusNamespace')]",
"type": "Microsoft.ServiceBus/namespaces",
"location": "[variables('location')]",
"properties": {
"messagingSku": 2
},
"resources": [
{
"apiVersion": "2015-08-01",
"name": "[parameters('notificationssmsqueue')]",
"type": "Queues",
"dependsOn": [
"[concat('Microsoft.ServiceBus/namespaces/', parameters('servicebusNamespace'))]"
],
"properties": {
"path": "[parameters('notificationssmsqueue')]"
},
"resources": [
{
"apiVersion": "2015-08-01",
"name": "[concat(parameters('notificationssmsqueue'),'.listen')]",
"type": "AuthorizationRules",
"dependsOn": [
"[parameters('notificationssmsqueue')]"
],
"properties": {
"keyName": "[concat(parameters('notificationssmsqueue'),'.listen')]",
"claimType": "SharedAccessKey",
"claimValue": "None",
"rights": [ "Listen" ],
"revision": -1
}
},
{
"apiVersion": "2015-08-01",
"name": "[concat(parameters('notificationssmsqueue'),'.send')]",
"type": "AuthorizationRules",
"dependsOn": [
"[parameters('notificationssmsqueue')]"
],
"properties": {
"keyName": "[concat(parameters('notificationssmsqueue'),'.send')]",
"claimType": "SharedAccessKey",
"claimValue": "None",
"rights": [ "Send" ],
"revision": -1
}
}
]
}
]
} ], "outputs": {
"connectionString": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/AuthorizationRules'),parameters('serviceBusNamespace'),'RootManageSharedAccessKey'),'2015-08-01').primaryConnectionString]"
},
"smsSendPrimaryKey": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/Queues/AuthorizationRules'),parameters('serviceBusNamespace'),parameters('notificationssmsqueue'),concat(parameters('notificationssmsqueue'),'.send')),'2015-08-01').PrimaryKey]"
},
"smsListenPrimaryKey": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/Queues/AuthorizationRules'),parameters('serviceBusNamespace'),parameters('notificationssmsqueue'),concat(parameters('notificationssmsqueue'),'.listen')),'2015-08-01').PrimaryKey]"
} } }
但我这样称呼我的模板:
New-AzureRMResourceGroupDeployment -ResourceGroupName $ResourceGroupName -TemplateFile "$scripts_folder$SB_create_script" -TemplateParameterObject `
@{ servicebusNamespace = $servicebusNamespace;
notificationssmsqueue = $NotificationSMSqueue }
这是获取所需信息的正确方法。资源管理器提供了一个通用接口来与所有服务进行交互。这就是门户网站访问服务的方式,每种语言 SDK 只是对与您创建的请求类似的请求的包装。
我通常使用 Python 或 java SDK,但有人告诉我,NodeJS 是一种非常简单的方法来包装 ARM 调用的 Web API,以构建与您类似的调用制作,如果您正在寻找 none ARM 方法来执行此操作。
我有一个现有的服务总线,其中包含一个队列和使用 Azure 资源管理器部署的事件中心。
现在我有兴趣在不使用 ServiceBus.dll 的情况下使用 Azure PowerShell 检索主键和连接字符串。可能吗??
作为解决方法,我创建了一个 ARM 模板,它不部署任何东西,只是查询现有资源并检索我需要的信息。以下模板检索特定服务总线命名空间
的事件 hub/queue 的连接字符串和主键{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"serviceBusNamespace": {
"type": "string",
"minLength": 1,
"metadata": {
"description": "The name of the service bus namespace to create."
}
},
"resourceName": {
"type": "string",
"minLength": 1,
"metadata": {
"description": "The name of the resource to be retreived."
}
},
"resourceType": {
"type": "string",
"minLength": 1,
"allowedValues": [
"queues",
"eventhubs"
],
"metadata": {
"description": "The type of the resource"
}
},
"policy": {
"type": "string",
"minLength": 1,
"defaultValue": "ManagePolicy",
"allowedValues": [
"ManagePolicy",
"SendPolicy",
"ListenPolicy"
],
"metadata": {
"description": "The type of the resource"
}
}
},
"variables": {
},
"resources": [ ],
"outputs": {
"connectionString": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/',parameters('resourceType'),'/authorizationRules'),parameters('serviceBusNamespace'),parameters('resourceName'),parameters('policy')),'2015-08-01').primaryConnectionString]"
},
"primaryKey": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/',parameters('resourceType'),'/authorizationRules'),parameters('serviceBusNamespace'),parameters('resourceName'),parameters('policy')),'2015-08-01').primaryKey]"
}
}
}
是否滥用 ARM 模板来查询 资源而不实际部署任何东西?
编辑 要在 PowerShell 中捕获 ARM 模板的输出,请使用以下代码
$ep = New-AzureRmResourceGroupDeployment -Name "getEventHub" -ResourceGroupName myResourceGroup -Mode Incremental -TemplateFile getEventHub.json -TemplateParameterFile getEventHub.param.json
$RuleConnString = $ep.Outputs.connectionString.value
$RulePrimaryKey = $ep.Outputs.primaryKey.value
请注意 属性 名称 connectionString 和 primaryKey 与我的模板文件中定义的相同
编辑 2
如果我重新运行 ARM 模板来第二次部署事件中心,我会收到以下错误。
除了使用 ARM 模板查询详细信息外,我没有找到任何选项。
我看不出你做的有什么问题。在我看来,资源管理器模板本质上是增量的。因此,您可以编写一个模板来创建具有相同资源的现有服务总线。如果属性相同,那么它将保持现有资源不变,并且 return 您是相关资源的连接字符串和主键。
我需要自动创建服务总线和队列并分离 send/listen 共享访问策略。您可以通过使用 Get-AzureSBAuthorizationRule 本机使用 PowerShell 在服务总线本身上检索连接字符串,而无需使用 .Net ServiceBus.dll 程序集,但由于当前仍然存在错误,这在队列级别不起作用。
我尝试使用 ServiceBus.dll 创建共享访问策略,但有时它会 运行 完全失败,但如果您随后立即 运行 第二次创建它,它随后会工作。我也尝试过资源管理器模板,但之前你必须传入你自己生成的密钥。现在我看到 Microsoft 为你生成了这些,但你仍然试图以自动化方式获取密钥,所以我喜欢你的解决方案。
但有一个问题,您是否可以捕获资源管理器模板输出并将它们传回 PowerShell 脚本,您知道吗?
干杯
罗布
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": {
"servicebusNamespace": {
"type": "string",
"metadata": {
"description": "The service bus namespace"
}
},
"notificationssmsqueue": {
"type": "string",
"metadata": {
"description": "Notifications SMS queue"
}
} }, "variables": {
"location": "[resourceGroup().location]", }, "resources": [
{
"apiVersion": "2015-08-01",
"name": "[parameters('servicebusNamespace')]",
"type": "Microsoft.ServiceBus/namespaces",
"location": "[variables('location')]",
"properties": {
"messagingSku": 2
},
"resources": [
{
"apiVersion": "2015-08-01",
"name": "[parameters('notificationssmsqueue')]",
"type": "Queues",
"dependsOn": [
"[concat('Microsoft.ServiceBus/namespaces/', parameters('servicebusNamespace'))]"
],
"properties": {
"path": "[parameters('notificationssmsqueue')]"
},
"resources": [
{
"apiVersion": "2015-08-01",
"name": "[concat(parameters('notificationssmsqueue'),'.listen')]",
"type": "AuthorizationRules",
"dependsOn": [
"[parameters('notificationssmsqueue')]"
],
"properties": {
"keyName": "[concat(parameters('notificationssmsqueue'),'.listen')]",
"claimType": "SharedAccessKey",
"claimValue": "None",
"rights": [ "Listen" ],
"revision": -1
}
},
{
"apiVersion": "2015-08-01",
"name": "[concat(parameters('notificationssmsqueue'),'.send')]",
"type": "AuthorizationRules",
"dependsOn": [
"[parameters('notificationssmsqueue')]"
],
"properties": {
"keyName": "[concat(parameters('notificationssmsqueue'),'.send')]",
"claimType": "SharedAccessKey",
"claimValue": "None",
"rights": [ "Send" ],
"revision": -1
}
}
]
}
]
} ], "outputs": {
"connectionString": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/AuthorizationRules'),parameters('serviceBusNamespace'),'RootManageSharedAccessKey'),'2015-08-01').primaryConnectionString]"
},
"smsSendPrimaryKey": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/Queues/AuthorizationRules'),parameters('serviceBusNamespace'),parameters('notificationssmsqueue'),concat(parameters('notificationssmsqueue'),'.send')),'2015-08-01').PrimaryKey]"
},
"smsListenPrimaryKey": {
"type": "string",
"value": "[listKeys(resourceId(concat('Microsoft.ServiceBus/namespaces/Queues/AuthorizationRules'),parameters('serviceBusNamespace'),parameters('notificationssmsqueue'),concat(parameters('notificationssmsqueue'),'.listen')),'2015-08-01').PrimaryKey]"
} } }
但我这样称呼我的模板:
New-AzureRMResourceGroupDeployment -ResourceGroupName $ResourceGroupName -TemplateFile "$scripts_folder$SB_create_script" -TemplateParameterObject ` @{ servicebusNamespace = $servicebusNamespace; notificationssmsqueue = $NotificationSMSqueue }
这是获取所需信息的正确方法。资源管理器提供了一个通用接口来与所有服务进行交互。这就是门户网站访问服务的方式,每种语言 SDK 只是对与您创建的请求类似的请求的包装。
我通常使用 Python 或 java SDK,但有人告诉我,NodeJS 是一种非常简单的方法来包装 ARM 调用的 Web API,以构建与您类似的调用制作,如果您正在寻找 none ARM 方法来执行此操作。