-1

我試圖通過模板實現集裝箱化的級別。最後,我希望能夠在一個模板中定義駐留在虛擬網絡和子網(如db羣集)內的組件(一個或多個服務器)。通過另一個模板,定義駐留在虛擬網絡和子網內的組件,但可能是不同的組件。使用AzureRM在同一vnet中部署不同子網的嵌套模板

模板答:

  • 我-VNET
    • 我-subnet1
      • 我接口1

模板B:

  • 我-VNET
    • 我-subnet2
      • 我的接口2

使得模板A內嵌套模板B將離開我:

模板AB:

  • 我-VNET
    • 我-subnet1
      • 我接口1
    • 我-subnet2
      • 我的接口2

相反,我得到以下錯誤:

New-AzureRmResourceGroupDeployment : 4:56:27 PM - Resource 
Microsoft.Network/virtualNetworks 'overlayTest-vnet' failed with message ' 
{ 
    "error": { 
    "code": "InUseSubnetCannotBeDeleted", 
    "message": "Subnet overlayTest-subnet2 is in use by /subscriptions/beep-boop/resourceGroups/d/providers/Microsoft.Network/networkInterfaces/overlayTest-vnet-interface2/ipConfigurations/ipconfig1 and cannot be deleted.", 
    "details": [] 
    } 
} 

得到的資源組填充像這樣(就好像嵌套模板部署和嵌套以下的資源退出)。

模板AB:

  • 我-VNET
    • 我-subnet2
      • 我的接口2

我的模板如下:

azuredeploy.json

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "solutionName": { 
     "type": "string", 
     "defaultValue": "testing" 
    }, 
    "vmIP": { 
     "type": "string", 
     "defaultValue": "10.0.100.100" 
    }, 
    "virtualNetworkName": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'), '-vnet')]" 
    }, 
    "vnetAddressPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.0.0/16" 
    }, 
    "subnetName": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'),'-subnet1')]" 
    }, 
    "subnetAddressPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.100.0/24" 
    }, 
    "subnetName2": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'),'-subnet2')]" 
    }, 
    "subnetAddressPrefix2": { 
     "type": "string", 
     "defaultValue": "10.0.101.0/24" 
    }, 
    "_artifactsLocation": { 
     "type": "string" 
    }, 
    "_artifactsLocationSasToken": { 
     "type": "securestring" 
    } 
    }, 
    "variables": { 
    "OverlaySubnetTemplateFolder": "nestedtemplates", 
    "OverlaySubnetTemplateFileName": "OverlaySubnet.json", 
    "OverlaySubnetTemplateParametersFileName": "OverlaySubnet.parameters.json", 
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName'))]", 
    "subnetRef": "[concat(variables('vnetID'), '/subnets/', parameters('subnetName'))]" 
    }, 
    "resources": [ 
    { 
     "name": "OverlaySubnet", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "dependsOn": [], 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[concat(parameters('_artifactsLocation'), '/', variables('OverlaySubnetTemplateFolder'), '/', variables('OverlaySubnetTemplateFileName'), parameters('_artifactsLocationSasToken'))]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "solutionName": { 
      "value": "[parameters('solutionName')]" 
      } 
     } 
     } 
    }, 
    { 
     "apiVersion": "2015-06-15", 
     "type": "Microsoft.Network/virtualNetworks", 
     "name": "[parameters('virtualNetworkName')]", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [], 
     "properties": { 
     "mode": "Incremental", 
     "addressSpace": { 
      "addressPrefixes": [ 
      "[parameters('vnetAddressPrefix')]" 
      ] 
     }, 
     "subnets": [ 
      { 
      "name": "[parameters('subnetName')]", 
      "properties": { 
       "mode": "Incremental", 
       "addressPrefix": "[parameters('subnetAddressPrefix')]" 
      } 
      } 
     ], 
     "virtualNetworkPeerings": [] 
     } 
    }, 
    { 
     "type": "Microsoft.Network/virtualNetworks/subnets", 
     "name": "[concat(parameters('virtualNetworkName'), '/', parameters('subnetName'))]", 
     "apiVersion": "2017-06-01", 
     "properties": { 
     "addressPrefix": "[parameters('subnetAddressPrefix')]", 
     "privateAccessServices": [] 
     }, 
     "dependsOn": [ 
     "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName'))]" 
     ] 
    }, 
    { 
     "type": "Microsoft.Network/virtualNetworks/subnets", 
     "name": "[concat(parameters('virtualNetworkName'), '/', parameters('subnetName2'))]", 
     "apiVersion": "2017-06-01", 
     "properties": { 
     "addressPrefix": "[parameters('subnetAddressPrefix2')]", 
     "privateAccessServices": [] 
     }, 
     "dependsOn": [ 
     "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName'))]" 
     ] 
    }, 
    { 
     "apiVersion": "2015-06-15", 
     "type": "Microsoft.Network/networkInterfaces", 
     "name": "[concat(parameters('virtualNetworkName'), '-interface1')]", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [ 
     "[concat('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]" 
     ], 
     "properties": { 
     "ipConfigurations": [ 
      { 
      "name": "ipconfig1", 
      "properties": { 
       /* 
       "privateIPAllocationMethod": "Static", 
       // reserved IP address range for /24 is 1-3, so start with [0 + 4] or more 
       "privateIPAddress": "[parameters('vmIP')]", 
       */ 
       "privateIPAllocationMethod": "Dynamic", 
       "subnet": { 
       "id": "[variables('subnetRef')]" 
       } 
      } 
      } 
     ] 
     } 
    } 
    ], 
    "outputs": {} 
} 

nestedtemplates/OverlaySubnet.json

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "solutionName": { 
     "type": "string", 
     "defaultValue": "testing" 
    }, 
    "virtualNetworkName": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'), '-vnet')]" 
    }, 
    "vnetAddressPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.0.0/16" 
    }, 
    "subnetName": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'),'-subnet2')]" 
    }, 
    "subnetAddressPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.101.0/24" 
    } 
    }, 
    "variables": { 
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',parameters('virtualNetworkName'))]", 
    "subnetRef": "[concat(variables('vnetID'),'/subnets/', parameters('subnetName'))]" 
    }, 
    "resources": [ 
    { 
     "apiVersion": "2015-06-15", 
     "type": "Microsoft.Network/virtualNetworks", 
     "name": "[parameters('virtualNetworkName')]", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [], 
     "properties": { 
     "addressSpace": { 
      "addressPrefixes": [ 
      "[parameters('vnetAddressPrefix')]" 
      ] 
     }, 
     "subnets": [ 
      { 
      "name": "[parameters('subnetName')]", 
      "properties": { 
       "mode": "Incremental", 
       "addressPrefix": "[parameters('subnetAddressPrefix')]" 
      } 
      } 
     ], 
     "virtualNetworkPeerings": [] 
     } 
    }, 
    { 
     "apiVersion": "2015-06-15", 
     "type": "Microsoft.Network/networkInterfaces", 
     "name": "[concat(parameters('virtualNetworkName'), '-interface2')]", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [ 
     "[concat('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]" 
     ], 
     "properties": { 
     "ipConfigurations": [ 
      { 
      "name": "ipconfig1", 
      "properties": { 
       /* 
       "privateIPAllocationMethod": "Static", 
       // reserved IP address range for /24 is 1-3, so start with [0 + 4] or more 
       "privateIPAddress": "[parameters('vmIP')]", 
       */ 
       "privateIPAllocationMethod": "Dynamic", 
       "subnet": { 
       "id": "[variables('subnetRef')]" 
       } 
      } 
      } 
     ] 
     } 
    } 
    ], 
    "outputs": {} 
} 

回答

0

最終,我實現了創建一個嵌套模板的目標,該模板在父模板的虛擬網絡中定義了自己的子網,同時保留了在沒有父模板的情況下部署嵌套模板的能力。關鍵是要使用條件虛擬網絡資源,並確保嵌套模板在嵌套時不會破壞父模板的虛擬網絡。感謝@ 4c74356b41推動我朝着正確的方向前進。

azuredeploy.json

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "solutionName": { 
     "type": "string", 
     "defaultValue": "testing" 
    }, 
    "vmIP": { 
     "type": "string", 
     "defaultValue": "10.0.100.100" 
    }, 
    "virtualNetworkName": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'), '-vnet')]" 
    }, 
    "vnetAddressPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.0.0/16" 
    }, 
    "subnetName": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'),'-subnet1')]" 
    }, 
    "subnetAddressPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.100.0/24" 
    }, 
    "subnetName2": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'),'-subnet2')]" 
    }, 
    "subnetAddressPrefix2": { 
     "type": "string", 
     "defaultValue": "10.0.101.0/24" 
    }, 
    "_artifactsLocation": { 
     "type": "string" 
    }, 
    "_artifactsLocationSasToken": { 
     "type": "securestring" 
    } 
    }, 
    "variables": { 
    "OverlaySubnetTemplateFolder": "nestedtemplates", 
    "OverlaySubnetTemplateFileName": "OverlaySubnet.json", 
    "OverlaySubnetTemplateParametersFileName": "OverlaySubnet.parameters.json", 
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName'))]", 
    "subnetRef": "[concat(variables('vnetID'), '/subnets/', parameters('subnetName'))]" 
    }, 
    "resources": [ 
    { 
     "name": "OverlaySubnet", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "dependsOn": [], 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[concat(parameters('_artifactsLocation'), '/', variables('OverlaySubnetTemplateFolder'), '/', variables('OverlaySubnetTemplateFileName'), parameters('_artifactsLocationSasToken'))]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "solutionName": { 
      "value": "[parameters('solutionName')]" 
      }, 
      "createVirtualNetwork": { 
      "value": "no" 
      } 
     } 
     } 
    }, 
    { 
     "apiVersion": "2015-06-15", 
     "type": "Microsoft.Network/virtualNetworks", 
     "name": "[parameters('virtualNetworkName')]", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [], 
     "properties": { 
     "mode": "Incremental", 
     "addressSpace": { 
      "addressPrefixes": [ 
      "[parameters('vnetAddressPrefix')]" 
      ] 
     }, 
     "subnets": [ 
      { 
      "name": "[parameters('subnetName')]", 
      "properties": { 
       "mode": "Incremental", 
       "addressPrefix": "[parameters('subnetAddressPrefix')]" 
      } 
      } 
     ], 
     "virtualNetworkPeerings": [] 
     } 
    }, 
    { 
     "type": "Microsoft.Network/virtualNetworks/subnets", 
     "name": "[concat(parameters('virtualNetworkName'), '/', parameters('subnetName'))]", 
     "apiVersion": "2017-06-01", 
     "properties": { 
     "addressPrefix": "[parameters('subnetAddressPrefix')]", 
     "privateAccessServices": [] 
     }, 
     "dependsOn": [ 
     "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName'))]" 
     ] 
    }, 
    { 
     "apiVersion": "2015-06-15", 
     "type": "Microsoft.Network/networkInterfaces", 
     "name": "[concat(parameters('virtualNetworkName'), '-interface1')]", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [ 
     "[concat('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]" 
     ], 
     "properties": { 
     "ipConfigurations": [ 
      { 
      "name": "ipconfig1", 
      "properties": { 
       /* 
       "privateIPAllocationMethod": "Static", 
       // reserved IP address range for /24 is 1-3, so start with [0 + 4] or more 
       "privateIPAddress": "[parameters('vmIP')]", 
       */ 
       "privateIPAllocationMethod": "Dynamic", 
       "subnet": { 
       "id": "[variables('subnetRef')]" 
       } 
      } 
      } 
     ] 
     } 
    } 
    ], 
    "outputs": {} 
} 

nestedtemplates/OverlaySubnet.json

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "solutionName": { 
     "type": "string", 
     "defaultValue": "testing" 
    }, 
    "createVirtualNetwork": { 
     "type": "string", 
     "defaultValue": "yes", 
     "allowedValues": [ 
     "yes", 
     "no" 
     ] 
    }, 
    "virtualNetworkName": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'), '-vnet')]" 
    }, 
    "vnetAddressPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.0.0/16" 
    }, 
    "subnetName": { 
     "type": "string", 
     "defaultValue": "[concat(parameters('solutionName'),'-subnet2')]" 
    }, 
    "subnetAddressPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.101.0/24" 
    } 
    }, 
    "variables": { 
    "createVirtualNetwork": "[equals(parameters('createVirtualNetwork'), 'yes')]", 
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',parameters('virtualNetworkName'))]", 
    "subnetRef": "[concat(variables('vnetID'),'/subnets/', parameters('subnetName'))]" 
    }, 
    "resources": [ 
    { 
     "condition": "[variables('createVirtualNetwork')]", 
     "apiVersion": "2015-06-15", 
     "type": "Microsoft.Network/virtualNetworks", 
     "name": "[parameters('virtualNetworkName')]", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [], 
     "properties": { 
     "addressSpace": { 
      "addressPrefixes": [ 
      "[parameters('vnetAddressPrefix')]" 
      ] 
     }, 
     "subnets": [ 
      { 
      "name": "[parameters('subnetName')]", 
      "properties": { 
       "mode": "Incremental", 
       "addressPrefix": "[parameters('subnetAddressPrefix')]" 
      } 
      } 
     ], 
     "virtualNetworkPeerings": [] 
     } 
    }, 
    { 
     "type": "Microsoft.Network/virtualNetworks/subnets", 
     "name": "[concat(parameters('virtualNetworkName'), '/', parameters('subnetName'))]", 
     "apiVersion": "2017-06-01", 
     "properties": { 
     "addressPrefix": "[parameters('subnetAddressPrefix')]", 
     "privateAccessServices": [] 
     }, 
     "dependsOn": [ 
     "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName'))]" 
     ] 
    }, 
    { 
     "apiVersion": "2015-06-15", 
     "type": "Microsoft.Network/networkInterfaces", 
     "name": "[concat(parameters('virtualNetworkName'), '-interface2')]", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [ 
     "[concat('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]", 
     "[concat('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'), '/subnets/', parameters('subnetName'))]" 
     ], 
     "properties": { 
     "ipConfigurations": [ 
      { 
      "name": "ipconfig1", 
      "properties": { 
       /* 
       "privateIPAllocationMethod": "Static", 
       // reserved IP address range for /24 is 1-3, so start with [0 + 4] or more 
       "privateIPAddress": "[parameters('vmIP')]", 
       */ 
       "privateIPAllocationMethod": "Dynamic", 
       "subnet": { 
       "id": "[variables('subnetRef')]" 
       } 
      } 
      } 
     ] 
     } 
    } 
    ], 
    "outputs": {} 
} 
1

變化互聯星空資源子網嵌套模板資源,它會工作。你試圖做的是創建一個新的vnet而不是現有的vnet,所以它會嘗試更新現有的vnet來匹配你的定義(所以刪除所有的子網並添加overlay中定義的1)。

但說實話,整個方法都是錯誤的,你應該使用屬性複製循環,並一氣呵成。

+0

如果我更改了嵌套模板互聯星空資源子網,嵌套的模板將不再對自己的部署。它將被要求嵌套,這對調試或升級來說相當不方便。 關於您的建議,整個方法是錯誤的:如何將一個副本和屬性跨越模板的循環? – ir0h

+1

好吧,我告訴你如何解決你的問題。如果你不能解決你的問題,我不能幫你。首先,在您共享的模板片段中,不需要嵌套部署。所以你只會讓自己的生活變得複雜,之後你會抱怨調試嵌套模板會更困難。好吧,我已經告訴你如何解決,但你不想聽。所以你想讓我做什麼?我無法改變臂模板的工作方式。 @ ir0h – 4c74356b41

+0

感謝您認爲是有幫助的。上面的模板是我真正在使用的非常簡單的例子。當然,根據您的豐富經驗,您可以在尋求幫助之前簡化使用案例,否則由於實際細節的噪音,難以定位問題。其次,我沒有抱怨。我解釋了您的解決方案的問題是嵌套模板不會獨立運行沒有VNET。我邀請你解釋如何使用它們,但是你卻決定在沒有澄清的情況下侮辱和侮辱。請坐下,你的幫助是不可取的。 – ir0h