我按照 official documention 上的教程进行操作如何访问 Arm 模板中的 key 保管库 secret 。我尝试了静态和动态 key 保管库 ID 的两种方法,并且我让它们都工作了。 奇怪的是动态 id 方法需要设置大量样板文件(需要嵌套模板)。
在静态id方法中,您需要在模板参数文件中指定:
"adminPassword": {
"reference": {
"keyVault": {
"id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>"
},
"secretName": "ExamplePassword"
}
}
这是很好且简单的设置。
但是,如果我在主模板文件的参数部分(不在参数文件中)尝试动态 id 方法的类似设置(没有嵌套模板),它将不起作用:
"adminPassword": {
"type": "secureobject",
"metadata": {
"description": "Key vault secret"
},
"defaultValue": {
"reference": {
"keyVault": {
"id": "[resourceId('keyvault-resource-group','Microsoft.KeyVault/vaults', 'keyvault-name')]"
},
"secretName": "ExamplePassword"
}
}
}
问题是为什么这种方法不起作用?也许与arm模板生命周期有关? 当您只需要从 key 保管库访问一两个 secret 时,这将显着减少样板文件的数量。
重复一下,我确实使用了官方文档中的静态和动态 id 方法来使用嵌套模板。这是尝试减少(如果可能)arm 模板中的行数或消除对嵌套模板的需要。
最佳答案
如documentation所示,您只能在链接模板参数中声明动态 key 保管库 ID,每次都必须为每个链接模板重复该 ID。
根据我的理解,您希望传入参数一次,然后将其重复用于多个链接的模板。
考虑到上述内容,您可以使用 New-AzResourceGroupDeployment
的内联参数从 PowerShell 传递securestring
。
ARM 模板
"adminPassword": {
"type": "securestring",
"metadata": {
"description": "Key vault secret"
}
}
PowerShell
$adminPassword = (Get-AzKeyVaultSecret `
-VaultName "keyVaultName" `
-Name "adminPassword").SecretValue
New-AzResourceGroupDeployment `
-ResourceGroupName "my-resource-group" `
-TemplateFile template.json `
-TemplateParameterFile parameters.json `
-adminPassword $adminPassword
您还可以将其与 Azure Key Vault Task 集成在 Azure Devops YAML 管道中:
- task: AzureKeyVault@1
inputs:
azureSubscription: $(subscriptionID)
KeyVaultName: $(keyVaultName)
SecretsFilter: '*'
RunAsPreJob: false
然后您就可以在后续任务中引用该 secret 。您还可以将此 secret 作为参数传递给 Azure Resource Group Deployment task .
关于azure - 访问 Azure ARM 模板中的 secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65490888/