Цикл значений в шаблонах ARM
Я работал над проблемой с шаблонами ARM уже более суток и, похоже, застрял, поэтому спрашиваю SO на случай, если кто-нибудь сможет помочь.
Чтобы описать проблему, у меня есть существующая установка хранилища ключей Azure и я хочу добавить несколько политик доступа к этой группе ресурсов. Для справки ниже приводится ссылка на шаблон ARM для добавления политик доступа к Key Vault:
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"]
}
}
]
}
}
Причина, по которой я хочу разобраться с циклом, а не дублировать политики доступа вручную, заключается в том, что я считаю, что это облегчит обслуживание, поскольку кадровые изменения можно обрабатывать, добавляя или удаляя значения из массива, а не дублируя или удалить большие части текста.
Я попытался понять синтаксис "копирования", изложенный здесь, но я не нашел правильную комбинацию, которая подходит для моего варианта использования:
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]]" (другими словами, если я просто жестко закодирую индекс массива, он работает, но если я пытаюсь использовать 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 ответ
Это более или менее то, что вы хотите (если я вас правильно понимаю):
{
"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