【问题标题】:Looping through values in ARM templates循环遍历 ARM 模板中的值
【发布时间】:2018-11-15 16:12:39
【问题描述】:

我用 ARM 模板解决一个问题已经超过一天了,似乎被卡住了,所以请询问 SO,以防有人能提供帮助。

为了描述这个问题,我有一个现有的 Azure Key Vault 设置,并希望向这个资源组添加一些访问策略。出于参考目的,以下是用于添加 Key Vault 访问策略的 ARM 模板参考:

https://docs.microsoft.com/en-gb/azure/templates/Microsoft.KeyVault/2018-02-14/vaults/accessPolicies

我希望为多个用户分配相同的权限,并且此用户列表不太可能经常更改,因此我希望在模板本身中对引用这些用户的 objectId 数组进行硬编码,然后使用“复制”功能创建多个访问策略。本质上,我希望最终结果接近于此,其中访问策略之间唯一变化的值是标识用户的 objectID:

{
    "name": "TestKeyVault/add",
    "type": "Microsoft.KeyVault/vaults/accessPolicies",
    "apiVersion": "2018-02-14",
    "properties": {
        "accessPolicies": [

            {
                "tenantId": "tenantIDStringGoesHere",
                "objectId": "guidForUser1GoesHere",
                "permissions": {
                    "keys": ["List"],
                    "secrets": ["List"],
                    "certificates": ["List"]
                }
            },

            {
                "tenantId": "tenantIDStringGoesHere",
                "objectId": "guidForUser2GoesHere",
                "permissions": {
                    "keys": ["List"],
                    "secrets": ["List"],
                    "certificates": ["List"]
                }
            }

        ]   
    }
}

我想通过循环而不是手动复制访问策略来解决这个问题的原因是,我相信它会使维护变得更容易,因为可以通过在数组中添加或删除值而不是使用数组来处理人员变动复制或删除大部分文本。

我试图理解此处概述的“复制”语法,但我没有找到适合我的用例的正确组合:

https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple

我得到的最接近的是:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {

    "keyVaultName": {
      "type": "string",
      "metadata": {
        "description": "Name of the Vault"
      }
    },

    "tenantId": {
      "type": "string",
      "defaultValue": "[subscription().tenantId]",
      "metadata": {
        "description": "Tenant Id of the subscription. Get using Get-AzureRmSubscription cmdlet or Get Subscription API"
      }
    },

    "objectId": {
      "type": "array",
      "defaultValue": [
        "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
      ],
      "metadata": {
        "description": "Object Id of the AD user. Get using Get-AzureRmADUser or Get-AzureRmADServicePrincipal cmdlets"
      }
    },

    "secretsPermissions": {
      "type": "array",
      "defaultValue": [
        "list"
      ],
      "metadata": {
        "description": "Permissions to secrets in the vault. Valid values are: all, get, set, list, and delete."
      }
    }

  },

  "variables": {
    "objectIdCount": "[length(parameters('objectId'))]"
  },

  "resources": [
    {

      "type": "Microsoft.KeyVault/vaults/accessPolicies",
      "name": "TestKeyVault/add",
      "apiVersion": "2018-02-14",
      "properties": {
        "accessPolicies": [{
          "tenantId": "[parameters('tenantId')]",
          "objectId": "[parameters('objectId')[copyIndex('objectIdCopy')]]",
          "permissions": {
            "secrets": "[parameters('secretsPermissions')]"
          },
          "copy": {
            "name": "objectIdCopy",
            "count": 2
          }


        }]
      }

    }
  ]

}

值得注意的是,虽然我用 X 和 Y 替换了这个 SO 版本中的 objectIds,但如果我替换“objectId”,代码在真实版本中有效:“[parameters('objectId')[copyIndex('objectIdCopy' )]]" 与 "objectId": "[parameters('objectId')[0]]" (换句话说,如果我只是硬编码数组索引它可以工作,但如果我尝试使用 copyIndex 它不会)。

我已经尝试过使用此模板的不同变体的各种错误消息,但在最新的迭代中,我尝试通过 PowerShell 部署模板时收到的错误消息基本上可以概括为“模板函数此位置不应出现“copyIndex””。

说起我一直用来测试的PowerShell,下面是简化版:

Clear-Host

$deploymentResourceGroupName = 'TestRG'

$templatePath = 'test_template.json'

$templateParameterObject = @{}
$templateParameterObject += @{'keyVaultName' = 'TestKeyVault'}

New-AzureRmResourceGroupDeployment -ResourceGroupName $deploymentResourceGroupName -TemplateFile $templatePath -TemplateParameterObject $templateParameterObject

我意识到这是一个很长的问题,但我希望我已经提供了足够的信息来帮助调试它。

有什么建议我应该改变以使复制功能正常工作吗?

【问题讨论】:

    标签: azure powershell arm-template azure-resource-group


    【解决方案1】:

    这或多或少是你想要的(如果我理解正确的话):

    {
        "type": "Microsoft.KeyVault/vaults/accessPolicies",
        "name": "TestKeyVault/add",
        "apiVersion": "2018-02-14",
        "properties": {
            "copy": [
                {
                    "name": "accessPolicies",
                    "count": "[length(parameters('objectId'))]",
                    "input": {
                        "tenantId": "[parameters('tenantId')]",
                        "objectId": "[parameters('objectId')[copyIndex('accessPolicies')]]",
                        "permissions": {
                            "secrets": "[parameters('secretsPermissions')]"
                        }
                    }
                }
            ]
        }
    }
    

    阅读:https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#property-iteration

    【讨论】:

    • 谢谢!您的建议有效,我错过了“名称”值需要是要循环的属性的值。也感谢您添加指向相关文档的直接链接。
    猜你喜欢
    • 1970-01-01
    • 2020-01-12
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2012-12-25
    • 2011-02-06
    相关资源
    最近更新 更多