Цикл значений в шаблонах ARM - PullRequest
0 голосов
/ 15 ноября 2018

Я работал над проблемой, с которой у меня были шаблоны ARM уже более суток, и, кажется, застрял, поэтому спрашиваю SO, если кто-то может помочь.

Чтобы описать проблемуУ меня есть существующая установка хранилища ключей Azure и я хочу добавить несколько политик доступа к этой группе ресурсов.Для справки ниже приводится ссылка на шаблон ARM для добавления политик доступа к хранилищу ключей:

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

У меня есть несколько пользователей, которым я хочу назначить одинаковые разрешения, и этосписок пользователей вряд ли будет часто меняться, поэтому я хочу жестко закодировать массив objectIds, ссылающихся на этих пользователей, в самом шаблоне, а затем использовать функцию «копирования» для создания политики множественного доступа.По сути, я хочу, чтобы конечный результат был близок к этому, где единственное значение, которое изменяется между политиками доступа, - это 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"]
                }
            }

        ]   
    }
}

Причина, по которой я хочу разобрать это с помощью цикла, а недублирование политик доступа вручную означает, что это облегчит обслуживание, поскольку кадровые изменения можно обрабатывать, добавляя или удаляя значения из массива, а не дублируя или удаляя большие части текста.

IЯ пытался понять синтаксис «копирования», описанный здесь, но я не нашел правильную комбинацию, которая подходит для моего варианта использования:

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
          }


        }]
      }

    }
  ]

}

Стоит отметить, что хотя я заменил objectIds в этой версии SO на X и Y, код работает в реальной версии, если я заменю «objectId»: «[parameters ('objectId') [copyIndex ('objectIdCopy')]] "with" objectId ":" [parameters ('objectId') [0]] "(другими словами, если я просто жестко закодирую индекс массива, тоorks, но если я пытаюсь использовать copyIndex, это не так).

У меня были различные сообщения об ошибках с различными вариантами этого шаблона, которые я пробовал, но с этой последней итерацией я получаю сообщение об ошибкепри попытке развернуть шаблон с помощью PowerShell его можно обобщить следующим образом: «Функция шаблона« copyIndex »не ожидается в этом месте».

Говоря о PowerShell, который я использовал для его тестирования, следующееупрощенная версия:

Clear-Host

$deploymentResourceGroupName = 'TestRG'

$templatePath = 'test_template.json'

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

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

Я понимаю, что это длинный вопрос, но я надеюсь, что предоставил достаточно информации, чтобы помочь с отладкой этого.

Любые предложения, что я должен изменитьчтобы работала функция копирования?

1 Ответ

0 голосов
/ 15 ноября 2018

Это более или менее то, что вы хотите (если я вас правильно понимаю):

{
    "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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...