Azure 循环遍历ARM模板中的值
我一直在研究一个关于ARM模板的问题,现在已经有一天多了,而且似乎被卡住了,所以继续问下去,以防有人能帮上忙 为了描述这个问题,我已经有了一个现有的Azure Key Vault设置,并希望向这个资源组添加一些访问策略。出于参考目的,以下是用于添加密钥Vault访问策略的ARM模板参考: 我希望为许多用户分配相同的权限,并且此用户列表不太可能经常更改,因此我希望在模板本身中硬编码引用这些用户的ObjectID数组,然后使用“复制”功能创建多访问策略。本质上,我希望最终结果接近于此,其中在访问策略之间更改的唯一值是标识用户的objectID:Azure 循环遍历ARM模板中的值,azure,powershell,arm-template,azure-resource-group,Azure,Powershell,Arm Template,Azure Resource Group,我一直在研究一个关于ARM模板的问题,现在已经有一天多了,而且似乎被卡住了,所以继续问下去,以防有人能帮上忙 为了描述这个问题,我已经有了一个现有的Azure Key Vault设置,并希望向这个资源组添加一些访问策略。出于参考目的,以下是用于添加密钥Vault访问策略的ARM模板参考: 我希望为许多用户分配相同的权限,并且此用户列表不太可能经常更改,因此我希望在模板本身中硬编码引用这些用户的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"]
}
}
]
}
}
我之所以想通过循环而不是手工复制访问策略来解决这个问题,是因为我相信这会使维护更容易,因为可以通过从数组中添加或删除值来处理人员更改,而不必复制或删除更大部分的文本
我试图理解这里概述的“复制”语法,但我没有找到适合我的用例的正确组合:
我得到的最接近的数据如下:
{
"$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
}
}]
}
}
]
}
值得注意的是,虽然我已将此SO版本中的objectId替换为X和Y,但如果我将“objectId”:“[parameters('objectId')[copyIndex('objectId')]]”替换为“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
我意识到这是一个很长的问题,但我希望我已经提供了足够的信息来帮助调试
有什么建议我应该更改什么以使复制功能正常工作吗?这或多或少是您想要的(如果我正确理解您的意思):
阅读:谢谢!您的建议奏效了,我忽略了“name”值必须是要循环的属性值。感谢您添加到相关文档的直接链接。
{
"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')]"
}
}
}
]
}
}