作为我正在进行的部署的一部分,我想要将 key 保管库部署到资源组中,创建一些 secret ,然后使用这些 secret 之一作为管理员密码将 SQL Server 部署到另一个资源组中。以下是我用于执行此操作的资源片段:
{
"type": "Microsoft.KeyVault/vaults",
"name": "[variables('KeyVaultName')]",
"apiVersion": "2015-06-01",
"location": "[resourceGroup().location]",
"properties": {
"enabledForTemplateDeployment": "true",
"accessPolicies": "[variables('KeyVaultAccessPolicies')]",
"tenantId": "[parameters('TenantId')]",
"sku": {
"name": "Standard",
"family": "A"
}
}
},
{
"type": "Microsoft.KeyVault/vaults/secrets",
"name": "[concat(variables('KeyVaultName'), '/secretname')]",
"apiVersion": "2015-06-01",
"properties": {
"value": "<a randomised value>"
},
"dependsOn": [
"[concat('Microsoft.KeyVault/vaults/', variables('KeyVaultName'))]"
]
},
{
"apiVersion": "2017-05-10",
"name": "deploy",
"type": "Microsoft.Resources/deployments",
"resourceGroup": "<another resource group>",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "<my linked template>",
"contentVersion": "1.0.0.0"
},
"parameters": {
"SQLServerAdminPasswordSecretName": {
"value": "secretname"
}
}
},
"dependsOn": [
"[resourceId('Microsoft.KeyVault/vaults/secrets', variables('KeyVaultName'), 'secretname')]"
]
}
我的链接模板还有一个部署,如下所示:
{
"apiVersion": "2017-05-10",
"name": "sql-server-deployment",
"type": "Microsoft.Resources/deployments",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "<another linked tempalate>",
"contentVersion": "1.0.0.0"
},
"parameters": {
"SQLServerName": {
"value": "[variables('SQLServerName')]"
},
"SQLServerAdminPassword": {
"reference": {
"keyVault": {
"id": "[resourceId(parameters('ParentResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('ParentKeyVaultName'))]"
},
"secretName": "[parameters('SQLServerAdminPasswordSecretName')]"
}
}
}
}
}
此引用目前正在终止我的整个部署:
"The specified KeyVault '/subscriptions/[subscription id]/resourceGroups/[parent resource group]/providers/Microsoft.KeyVault/vaults/[my keyvault]' could not be found."
如果我删除链接模板中的 Keyvault 引用,错误就会消失。
令我困惑的是,链接的模板部署取决于 key 保管库 secret ,而 key 保管库 secret 又取决于 key 保管库,但没有部署任何内容,因为 key 保管库引用正在尝试先于其他任何事情进行解析。
我是否遗漏了一些明显的东西,或者这是 ARM 模板中的缺陷?
提前致谢
最佳答案
参数引用在“编译”时(即验证)进行评估,因此在验证模板时,库确实需要存在。您也许可以通过嵌套几层深度并使用嵌套部署中的输出引用来实现这一目标。你需要做这样的事情:
- 嵌套保管库设置并输出VaultId
- 将 SQL Server 部署嵌套到“1 级”嵌套中
- 在上述项目符号的参数中,引用第 1 步中的输出
- 使用从“1 级”嵌套中的VaultId 构造的参数引用嵌套另一个部署
也就是说,我对你为什么要这样做感兴趣......通常,保管库引用用于保密纯文本/json。由于您将 secret 值传递到顶层的部署中,因此您已经拥有该值。没有理由从保管库引用它,因为您已经拥有它......
关于azure - 无法在同一 ARM 模板部署中创建和引用 keyvault secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48591761/