【问题标题】:ARM template iteration for child objects子对象的 ARM 模板迭代
【发布时间】: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()].keysPermissionss 后面只有一个 s,而不是两个)

标签: azure azure-resource-manager azure-keyvault arm-template


【解决方案1】:

谢谢Nick Graham。发布您的建议作为帮助其他社区成员的答案。

在 ARM 模板的复制循环内有一个错字,permissions[copyIndex()].keyssPermissions 应该是 permissions[copyIndex()].keysPermissionsskey 之后只有一个 s 而不是两个)

您可以参考How to create an Azure key vault and vault access policy by using a Resource Manager templateAzure Resource Manager child resourcesCan I loop over properties in ARM templates?

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 2023-03-17
    • 1970-01-01
    • 2021-10-30
    • 2014-10-18
    • 2019-09-02
    • 2012-08-10
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多