【发布时间】:2021-11-08 20:46:35
【问题描述】:
我有一个 PowerShell 脚本来部署核心基础设施,其中包括 Key Vault 的以下部分:
##### KEY VAULT DEPLOYMENT #####
# Set Key Vault related paths
$keyVaultTemplateFile = "$($artifactRootDir)ARM/arm-keyvault.json"
$keyVaultConfig = (Get-Content $configFile -Raw | ConvertFrom-Json).KeyVaults
ForEach($keyVault in $keyVaultConfig) {
# Create hashtable of key vaule pairs to pass to ARM template
$keyVaultResourceGroup = -join($envName, '-', $keyvault.resourceGroup)
$keyVaultParams = @{
envName = $envName;
vaultName = $keyvault.vaultName;
skuName = $keyvault.skuName;
accessPolicies = $keyvault.accessPolicies;
}
Write-Host "Deploying Key Vault: $($keyVaultName)"
New-AzureRmResourceGroupDeployment -ResourceGroupName $keyVaultResourceGroup -TemplateFile $keyVaultTemplateFile -TemplateParameterObject $keyVaultParams
}
脚本循环遍历自定义配置文件中的 JSON 数组,该文件包含环境特定的配置值。值文件的 Key Vault 部分如下所示:
"KeyVaults": [
{
"vaultName": "kv-ops-mgmt-01",
"resourceGroup": "rg-opsmgmt-01",
"skuName": "Standard",
"accessPolicies": {
"permissions": [
{
"objectId": "********-****-****-****-************",
"certificatesPermissions": "",
"secretsPermissions": "Get, List, Set",
"keysPermissions": ""
}
]
}
}
],
最后,这是 Key Vault 的 ARM 模板:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"envName": {
"type": "string",
"defaultValue": "dev",
"metadata": {
"description": "Environment name - e.g. dev, tst, stg, prd"
}
},
"vaultName": {
"type": "string",
"metadata": {
"description": "The name of the key vault to be created."
}
},
"skuName": {
"type": "string",
"defaultValue": "Standard",
"allowedValues": [
"Standard",
"Premium"
],
"metadata": {
"description": "The SKU of the vault to be created."
}
},
"accessPolicies": {
"type": "object",
"metadata": {
"description": "Array of Key Vault access policies"
}
}
},
"variables": {
"vaultName": "[concat(parameters('envName'), '-', parameters('vaultName'))]"
},
"resources": [
{
"type": "Microsoft.KeyVault/vaults",
"apiVersion": "2019-09-01",
"name": "[variables('vaultName')]",
"location": "[resourceGroup().location]",
"properties": {
"enableRbacAuthorization": false,
"enableSoftDelete": false,
"enabledForDeployment": false,
"enabledForDiskEncryption": false,
"enabledForTemplateDeployment": false,
"tenantId": "[subscription().tenantId]",
"copy": [
{
"name": "accessPolicies",
"count": "[length(parameters('accessPolicies').permissions)]",
"input": {
"tenantId": "[subscription().tenantId]",
"objectId": "[parameters('accessPolicies').permissions[copyIndex()].objectId]",
"permissions": {
"certificates": "[parameters('accessPolicies').permissions[copyIndex()].certificatesPermissions]",
"secrets": "[parameters('accessPolicies').permissions[copyIndex()].secretsPermissions]",
"keys": "[parameters('accessPolicies').permissions[copyIndex()].keyssPermissions]"
}
}
}
],
"sku": {
"name": "[parameters('skuName')]",
"family": "A"
},
"networkAcls": {
"defaultAction": "Allow",
"bypass": "AzureServices"
}
}
}
],
"outputs": {
}
}
我喜欢这种方法,因为我可以为不同的 Azure 组件使用单独的 ARM 模板,而无需使用具有许多依赖项的庞大复杂模板。
我还喜欢这样一个事实,即通过使用自定义 JSON 配置文件,我可以将对象添加到文件并对其进行迭代,而无需像在 ARM 参数中那样提供唯一名称(keyvault1、keyvault2 等)文件。
不幸的是,我似乎无法让它工作并且在访问 accessPolicies.permissions 中的值时出错。
任何人都可以提供帮助或建议更好的方法吗?
【问题讨论】:
-
能否提供错误详情
-
在 ARM 模板的复制循环内有一个错字,
permissions[copyIndex()].keyssPermissions应该是permissions[copyIndex()].keysPermissions(s后面只有一个s,而不是两个)
标签: azure azure-resource-manager azure-keyvault arm-template