在不影响现有子网的情况下将 Azure VPN 网关部署到现有 vnet
Deploy Azure VPN gateway to existing vnet without affecting existing subnets
我正在尝试将新的 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 的模板。
谁能提供答案或建议?谢谢
以下 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')]"
}
}
]
}
不幸的是,这在 ARM 中似乎没有得到很好的支持。这是因为 VNET 是一种资源,而子网是该资源的 属性。部署 ARM 模板时,将忽略任何未提及的资源(至少在迭代模式下)。
但是,必须指定所提及的现有资源的属性。这是因为 Azure 会尝试实现模板中指定的资源。如果 属性 不同,它会改变它。如果 属性 不存在,它将删除它。
可能的解决方案:
每个 vnet 都有多个模板。当您进行更改时,您会更新整个 vnet。这需要您跟踪多个模板,对于基础设施即代码来说并不理想,但它是一个简单的解决方案。
改用 powershell 解决方案:
https://docs.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-tutorial-create-gateway-powershell。我自己还没有尝试过,因为我的上级告诉我使用 ARM,但是在几个论坛上已经建议将其作为替代方案。
- 您也可以按照本指南尝试使用复制循环,但这实用性有限,我还没有验证您是否可以使用名称数组而不是数字数组:
https://pkm-technology.com/azure-vnet-json/
- 将您的子网更新为单独模板的一部分。这要求您还更新您的主 vnet 模板,否则如果您重新部署主 vnet 模板,您的新子网将被删除。此外,您只能通过这种方式添加子网。如果您想做其他事情,例如部署 VPN 网关,这也无济于事。
我正在尝试将新的 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 的模板。
谁能提供答案或建议?谢谢
以下 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')]"
}
}
]
}
不幸的是,这在 ARM 中似乎没有得到很好的支持。这是因为 VNET 是一种资源,而子网是该资源的 属性。部署 ARM 模板时,将忽略任何未提及的资源(至少在迭代模式下)。
但是,必须指定所提及的现有资源的属性。这是因为 Azure 会尝试实现模板中指定的资源。如果 属性 不同,它会改变它。如果 属性 不存在,它将删除它。
可能的解决方案:
每个 vnet 都有多个模板。当您进行更改时,您会更新整个 vnet。这需要您跟踪多个模板,对于基础设施即代码来说并不理想,但它是一个简单的解决方案。
改用 powershell 解决方案:
https://docs.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-tutorial-create-gateway-powershell。我自己还没有尝试过,因为我的上级告诉我使用 ARM,但是在几个论坛上已经建议将其作为替代方案。
- 您也可以按照本指南尝试使用复制循环,但这实用性有限,我还没有验证您是否可以使用名称数组而不是数字数组:
https://pkm-technology.com/azure-vnet-json/
- 将您的子网更新为单独模板的一部分。这要求您还更新您的主 vnet 模板,否则如果您重新部署主 vnet 模板,您的新子网将被删除。此外,您只能通过这种方式添加子网。如果您想做其他事情,例如部署 VPN 网关,这也无济于事。