我正在尝试将新的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的模板。
任何人都可以提供答案或建议吗?谢谢。
答案 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尝试实现模板中指定的资源。如果属性不同,它将对其进行更改。如果没有属性,它将删除它。
可能的解决方案:
每个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/