我正在尝试使用Azure DevOps发布管道部署ARM模板。 Azure KeyVault是模板中的资源之一。当我使用Powershell脚本时,部署成功。但是,当使用Azure DevOps Release管道时,部署失败,并显示错误“在请求中找到错误的JSON内容”
https://i.stack.imgur.com/o9sbD.png
密钥库资源定义如下。
{
"type": "Microsoft.KeyVault/vaults",
"apiVersion": "2018-02-14",
"name": "[parameters('keyVaultName')]",
"location": "[parameters('location')]",
"tags": {
"displayName": "KeyVault"
},
"properties": {
"enabledForDeployment": "[parameters('enabledForDeployment')]",
"enabledForTemplateDeployment": "[parameters('enabledForTemplateDeployment')]",
"enabledForDiskEncryption": "[parameters('enabledForDiskEncryption')]",
"tenantId": "[parameters('tenantId')]",
"accessPolicies": [],
"sku": {
"name": "[parameters('skuName')]",
"family": "A"
}
}
}
更新:我怀疑这可能是由于租户ID造成的,并对租户ID进行了硬编码以进行测试。但是仍然没有运气。
答案 0 :(得分:0)
根据日志,您正在任务中指定替代参数。这就是为什么您使用我提供的ARM模板,但仍然遇到Bad Request错误的原因。因为在任务逻辑中,ARM文件中的脚本是API的请求正文。而且,我们使用此API创建您在Azure中指定的资源。有关所描述的详细任务逻辑,请参阅我的previous answer。
ARM模板中的参数定义正确,但是现在,由指定的覆盖参数引起的错误:
更具体地说,该错误是由于参数覆盖定义中的subscription().tenantId
引起的。
您可以尝试使用Write-Host subscription().tenantId
来获取其值,并使用 Azure powershell任务打印出来。您将看到它什么也没得到。一个字,只能在Json
文件中使用,而不能在任务中使用。
现在,由于此表达式中没有值,因此您还覆盖了JSON文件中定义的先前值。当任务将要使用API创建天蓝色资源时,它将缺少请求主体中的关键参数值(tenantId
)。
有2种解决方案可以解决它。
1。请勿尝试覆盖其值使用表达式的参数。
这里我只是说与Azure订阅相关的参数。大多数表达式无法在Azure ARM部署任务中编译。
2。如果您仍要使用任务中的特殊表达式覆盖这些特殊参数。
如果是这样,您必须首先添加一个任务,以从中获得tenantId
。然后将其传递给ARM部署任务。
您可以使用以下示例脚本添加Azure Powershell任务:
Write-Output "Getting tenantId using Get-AzureRmSubscription..."
$subscription = (Get-AzureRmSubscription -SubscriptionId $azureSubscriptionId)
Write-Output "Requested subscription: $azureSubscriptionId"
$subscriptionId = $subscription.Id
$subscriptionName = $subscription.Name
$tenantId = $subscription.tenantId
Write-Output "Subscription Id: $subscriptionId"
Write-Output "Subscription Name: $subscriptionName"
Write-Output "Tenant Id: $tenantId"
Write-Host "##vso[task.setvariable variable=TenantID;]$$tenantId"
然后在下一个任务中,您可以使用$(TenantID)来获取其值。
我仍然建议您使用第一种解决方案,因为如果选择第二种解决方案,管道的体积会增加并且变得复杂。