你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在 Azure 资源管理器模板的复制循环中使用对象作为参数
在 Azure 资源管理器模板(ARM 模板)中使用对象作为参数时,可将其包括在复制循环中。 此方法与串行复制循环结合使用时非常有用,尤其是在部署子资源时。
为了演示此方法,下面看一下使用两个安全规则部署网络安全组 (NSG) 的模板。
首先看一下参数。 在查看模板时会看到,我们已经定义了一个名为 networkSecurityGroupsSettings
的参数,其中包括一个名为 securityRules
的数组。 此数组包含两个 JSON 对象,每个对象指定定义安全规则的设置。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters":{
"networkSecurityGroupsSettings": {
"value": {
"securityRules": [
{
"name": "RDPAllow",
"description": "allow RDP connections",
"direction": "Inbound",
"priority": 100,
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "10.0.0.0/24",
"sourcePortRange": "*",
"destinationPortRange": "3389",
"access": "Allow",
"protocol": "Tcp"
},
{
"name": "HTTPAllow",
"description": "allow HTTP connections",
"direction": "Inbound",
"priority": 200,
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "10.0.1.0/24",
"sourcePortRange": "*",
"destinationPortRange": "80",
"access": "Allow",
"protocol": "Tcp"
}
]
}
}
}
}
现在我们看看模板。 我们有一个名为 NSG1
的资源,用于部署 NSG。 它还使用 ARM 的内置属性迭代功能。 通过将复制循环添加到模板中资源的 properties 节,可以在部署过程中动态设置属性的项数。 还可以避免重复模板语法。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"VNetSettings": {
"type": "object"
},
"networkSecurityGroupsSettings": {
"type": "object"
}
},
"resources": [
{
"apiVersion": "2020-05-01",
"type": "Microsoft.Network/virtualNetworks",
"name": "[parameters('VNetSettings').name]",
"location": "[resourceGroup().location]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"[parameters('VNetSettings').addressPrefixes[0].addressPrefix]"
]
},
"subnets": [
{
"name": "[parameters('VNetSettings').subnets[0].name]",
"properties": {
"addressPrefix": "[parameters('VNetSettings').subnets[0].addressPrefix]"
}
},
{
"name": "[parameters('VNetSettings').subnets[1].name]",
"properties": {
"addressPrefix": "[parameters('VNetSettings').subnets[1].addressPrefix]"
}
}
]
}
},
{
"apiVersion": "2020-05-01",
"type": "Microsoft.Network/networkSecurityGroups",
"name": "NSG1",
"location": "[resourceGroup().location]",
"properties": {
"copy": [
{
"name": "securityRules",
"count": "[length(parameters('networkSecurityGroupsSettings').securityRules)]",
"input": {
"name": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].name]",
"properties": {
"description": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].description]",
"priority": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].priority]",
"protocol": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].protocol]",
"sourcePortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].sourcePortRange]",
"destinationPortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].destinationPortRange]",
"sourceAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].sourceAddressPrefix]",
"destinationAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].destinationAddressPrefix]",
"access": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].access]",
"direction": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].direction]"
}
}
}
]
}
}
]
}
让我们详细了解如何在 securityRules
子资源中指定属性值。 所有属性都使用 parameters()
函数进行引用。 然后我们使用点运算符引用 securityRules
数组,并根据迭代的当前值建立它的索引。 最后,使用另一个点运算符引用对象名称。
尝试模板
GitHub 上提供了一个示例模板。 若要部署该模板,请克隆存储库并运行以下 Azure CLI 命令:
git clone https://github.com/mspnp/template-examples.git
cd template-examples/example3-object-param
az group create --location <location> --name <resource-group-name>
az deployment group create -g <resource-group-name> \
--template-uri https://raw.githubusercontent.com/mspnp/template-examples/master/example3-object-param/deploy.json \
--parameters deploy.parameters.json
后续步骤
- Azure Resource Manager
- 什么是 ARM 模板?
- 教程:创建和部署你的第一个 ARM 模板
- 教程:将资源添加到 ARM 模板
- ARM 模板最佳做法
- Azure 资源管理器文档
- ARM 模板文档