【问题标题】:Azure Resource Manager Template: Conditional DeploymentAzure 资源管理器模板:条件部署
【发布时间】:2020-06-25 14:19:20
【问题描述】:

我正在使用 ARM 模板,需要执行条件部署。例如,我在变量“子网”中定义了两个网络安全组。

"variables": {
    "subnets": [
        {
            "subnetname": "AzureBastionSubnet",
            "nsgname": "nsg_bastion1"
        },
        {
            "subnetname": "client-subnet",
            "nsgname": "nsg_client1"
        }
    ]
}

网络安全组“nsg_bastion1”需要使用预定义规则进行特殊处理,因为它是 Azure Bastion 子网的网络安全组。 'nsg_client1' 将分配一些自定义规则,此时无关紧要。

为了区分非堡垒网络安全组和堡垒网络安全组,我创建了两个条件资源块:

"resources": [
// NSG (non-Bastion)
{
    "condition": "[not(equals(variables('subnets')[copyIndex()].name, 'AzureBastionSubnet'))]",
    "name": "[variables('subnets')[copyIndex()].nsg]",
    "type": "Microsoft.Network/networkSecurityGroups",
    "apiVersion": "2019-11-01",
    "location": "[parameters('location')]",
    "properties": {},
    "copy": {
        "name": "nsg-c",
        "count": "[length(variables('subnets'))]"
    }
},
// NSG (Bastion)
{
    "condition": "[equals(variables('subnets')[copyIndex()].name, 'AzureBastionSubnet')]",
    "name": "[variables('subnets')[copyIndex()].nsg]",
    "type": "Microsoft.Network/networkSecurityGroups",
    "apiVersion": "2019-11-01",
    "location": "[parameters('location')]",
    "properties": {},
    "resources": [
        // Bastion Security Rules .....
    ],
    "copy": {
        "name": "nsg-bastion-c",
        "count": "[length(variables('subnets'))]"
    }
},]

条件属性检查子网是否称为“AzureBastionSubnet”。我已经验证这仅适用于两个资源块,但是当它们都包含在代码中时它不起作用。它总是抛出以下错误消息:

    Code=InvalidTemplate; Message=Deployment template validation failed:
'The resource 'Microsoft.Network/networkSecurityGroups/AzureBastionSubnet' at line '' and column '' is defined multiple times in a template.

如果有任何帮助,我将不胜感激,在此先感谢!

【问题讨论】:

  • 我建议将 AzureBastion NSG 设置为不同的参数,而不是将其包含在普通 NSG 的相同数组中。我想知道 copyIndex() 在条件中是如何工作的。
  • 如何部署模板?更具体地说,您知道部署中的 PUT 中的 apiVersion 是什么吗? (这是要修复的)
  • nm - 请参阅下面的答案...

标签: azure azure-resource-manager


【解决方案1】:

好的,我以为我们已经解决了这个问题,但还没有……

即使您的条件是互斥的,您也不能在同一个模板中拥有两个具有相同 resourceId 的资源。

我猜两者的区别在于安全规则?如果是这样,最简单的选择可能是定义 2 个单独的变量,然后使用 if() 语句根据您的条件在它们之间进行交换。

如果你想在模板上扩展失败可以看看是否有更好的选择......

【讨论】:

  • 在我们根据条件使用或不使用资源中的属性的情况下会怎样。例如:docs.microsoft.com/en-us/azure/templates/… hostnameConfigurations 是一个数组,它不是必需的。我想根据我的参数列表中的布尔条件来提供这个。在这种情况下我能做什么?如果我的情况为假,我不能只定义一个变量并使其内容为空。那将提供空值或空值对吗?
  • 听起来像这种情况:github.com/Azure/azure-quickstart-templates/blob/master/… - 你可以这样说:if(not(empty(hosthames)), hostnames, json('null')) - 你说得对空,这在 ARM 中具有特定含义(即空数组),但 json('null') 会从声明中删除该属性,就好像您从未提供过它一样。
  • 是的,绝对是我需要的。谢谢@bmoore-msft。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2015-11-20
  • 1970-01-01
相关资源
最近更新 更多