将Azure VPN网关部署到现有vnet而不影响现有子网

时间:2019-06-18 12:22:51

标签: azure azure-resource-manager gateway arm-template azure-virtual-network

我正在尝试将新的Azure虚拟网络网关部署到包含多个子网的现有VNET。我首先在测试环境中使用虚拟子网进行配置。我正在使用ARM创建一个.json模板和参数文件,并通过Jenkins进行部署。当前,该模板在部署虚拟网络网关时会尝试重新部署整个VNET。我不希望它这样做。我希望它将虚拟网络网关部署到现有的VNET。请参见下面有关我如何在模板中编码VNET的信息。

{
    "apiVersion": "2019-04-01",
    "type": "Microsoft.Network/virtualNetworks",
    "name": "[parameters('virtualNetworkName')]",
    "location": "[resourceGroup().location]",
    "properties": {
      "addressSpace": {
        "addressPrefixes": [
          "[parameters('azureVNetAddressPrefix')]"
        ]
      },
      "subnets": [
        {
          "name": "GatewaySubnet",
          "properties": {
            "addressPrefix": "[parameters('gatewaySubnetPrefix')]"
          }
        }
      ]
    }
  }

在部署此模板时,我在Jenkins中收到以下错误:

"code": "InUseSubnetCannotBeDeleted",

"message": "Subnet testing-subnet is in use by /subscriptions/****/resourceGroups/networks-dev-rg/providers/Microsoft.Network/networkInterfaces/dev-jmp-d31653/ipConfigurations/ipconfig1 and cannot be deleted. In order to delete the subnet, delete all the resources within the subnet. See aka.ms/deletesubnet."

我查看了Microsoft知识库,但是我一直在努力寻找如何执行此操作的解释,或者是否可行。理想情况下,我希望避免列出vnet中的所有子网,因为这是我想应用于具有不同子网的不同vnet的模板。

任何人都可以提供答案或建议吗?谢谢。

3 个答案:

答案 0 :(得分:1)

对不起,没有足够的代表发表评论。

几周前,我也遇到了同样的问题。不幸的是,增量部署无法像您期望的那样使用子网。如果您提供一个空数组,它将看到“与以前不同”,并尝试删除所有子网。

因此,要添加新的子网,您需要提供所有以前的子网以及新的子网。

请参阅此问题并提供一些有用的评论:https://github.com/Azure/azure-quickstart-templates/issues/2786

答案 1 :(得分:0)

以下ARM模板会将子网添加到具有现有子网的虚拟网络中,并且不会打扰现有子网。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "virtualNetworkName": {
      "type": "string",
      "defaultValue": "VNet1"
    },
    "gatewaySubnetPrefix": {
      "type": "string",
      "defaultValue": "10.0.2.0/24"
    }
  },
  "variables": {},
  "resources": [
    {
      "apiVersion": "2019-04-01",
      "type": "Microsoft.Network/virtualNetworks/subnets",
      "name": "[concat(parameters('virtualNetworkName'), '/GatewaySubnet')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "addressPrefix": "[parameters('gatewaySubnetPrefix')]"
      }
    }
  ]
}

答案 2 :(得分:0)

不幸的是,ARM似乎对此功能没有很好的支持。这是因为VNET是资源,而子网是该资源的属性。部署ARM模板时,任何未提及的资源都将被忽略(至少在迭代模式下)。

但是,必须指定所提及的现有资源的属性。这是因为Azure尝试实现模板中指定的资源。如果属性不同,它将对其进行更改。如果没有属性,它将删除它。

可能的解决方案:

  1. 每个vnet都有多个模板。进行更改时,将更新整个vnet。这需要您跟踪多个模板,对于作为代码的基础结构而言不是理想的选择,而是一个简单的解决方案。

  2. 改为使用Powershell解决方案:

https://docs.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-tutorial-create-gateway-powershell。我还没有亲自尝试过这种方法,因为我的上级告诉我要使用ARM,但是在一些论坛上已经建议使用它作为替代方法。

  1. 您也可以按照此指南尝试使用copyloop,但这实用程序有限,我尚未验证是否可以使用名称数组而不是数字数组:

https://pkm-technology.com/azure-vnet-json/

  1. 作为单独模板的一部分更新您的子网。这还需要您还更新主vnet模板,否则,如果您重新部署主vnet模板,则将删除新的子网。另外,您只能以这种方式添加子网。如果您想做其他事情(如部署VPN网关),则无济于事。