当前位置: 首页 > 知识库问答 >
问题:

Azure资源管理器模板:有条件部署

松元明
2023-03-14

我正在处理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.

我将感谢任何帮助,提前感谢!

共有1个答案

于嘉许
2023-03-14

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

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

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

如果失败,如果你想在模板上展开,可以看看是否有更好的选项。。。

 类似资料:
  • 我试图完全清理资源组在Azure。 删除资源组不是选项(访问权限:参与者,而不是所有者) 做到这一点的最优雅和明显的方法(也在一些文章中描述)是使用“空”部署模板执行完整的部署: 删除SQL Server开始“...”接受“...”失败“...”开始“...”接受“...”失败“... 你想到主意了。 其他时候效果很好。 您将得到数据库删除的无限循环“开始..接受..失败..开始..接受..失败.

  • 最近我开始创建一个新的资源组,但它似乎被困在配置服务器场资源上。重新启动部署会输出以下错误: 我没有时间等待它的到期。有没有办法取消Azure ARM部署?

  • 我想为基于ARM模板的VM部署禁用“Windows更新”。我在最近的Microsoft中找到了相关设置。计算提供程序架构。但我没有找到使用此设置的任何ARM模板。我搜索了几个与Windows VM部署相关的Azure快速入门模板——但没有一个打算在预配时控制Windows更新服务的行为。我知道CLASSIC部署模型可用的选项,但我正在明确寻找使用Azure资源管理器部署模型的解决方案。 我试图在现

  • 语境 另外,如果我从模板中删除createMode和sourceDatabaseId,一切都很好。 这就是上面使用的模板

  • 我开始做一些类似资源类的东西,在那里我可以为我的应用程序保存我所有的文件,像图像和声音,但它变得非常混乱,所有的东西都在应用程序的乞求中加载。 这是包含所有内容的类:https://sourceb.in/s8rjgqqgss(头文件)https://sourceb.in/cjiq78hdov(cpp文件的一部分) 我很抱歉把它贴在不同的网站上,但正如你所看到的,它真的很乱,我也不知道如何让它变得更

  • 我如何知道要提供哪些参数以及哪些参数在Azure资源中被覆盖? 我得到这些错误和失去大量的时间弄清楚哪些参数我需要 我应该从参数文件中的参数开始,然后将默认值粘贴到模板中吗?(如果是这样,为什么他们还没有这样做?) 是否有办法读取运行系统的实际参数。当我在azure中使用自动化脚本部分时,值为null "$Schema":"https://schema.management.azure.com/s