Azure多VM创建失败:公IP已被其他资源占用
多台Azure VM创建失败:公共IP重复分配问题
问题现象
第一台VM创建成功,但第二台创建时报错:
| Resource /subscriptions/....../networkInterfaces/xxxxx/ipConfigurations/xxxxx is referencing public IP address | /subscriptions/xxxxxxxxx/providers/Microsoft.Network/publicIPAddresses/Microsoft.Azure.Commands.Network.Models.PSPublicIpAddress that is already allocated to | resource /subscriptions/......./networkInterfaces/xxxxx/ipConfigurations/xxxxx.
问题脚本
param( [string] $WeekNo="NoWeek", [int] $VmCount=0 ) #$cred = Get-Credential -Message "Enter a username and password for the virtual machine." ## VM Account # Credentials for Local Admin account you created in the sysprepped (generalized) vhd image $VMLocalAdminUser = "xxxxx" $VMLocalAdminSecurePassword = ConvertTo-SecureString "xxxxxxx" -AsPlainText -Force $image = "/subscriptions/xxxxxxx/resourceGroups/xxxxxx/providers/Microsoft.Compute/images/xxxxxxxxx" ## Azure Account $LocationName = "SwedenCentral" $ResourceGroupName = "xxxx_" + $WeekNo if( -Not( Get-AzureRmResourceGroup -Name $ResourceGroupName -Location $LocationName -ErrorAction Ignore)) { New-AzureRmResourceGroup -Name $ResourceGroupName -Location $LocationName Write-Host "ResourceGroup" $ResourceGroupName "created" $VMSize = "Standard_B2ms" ## Networking $NetworkName = "xxxxxx_" + $WeekNo + "_net" # "MyNet" $SubnetName = "MySubnet" $SubnetAddressPrefix = "10.0.0.0/24" $VnetAddressPrefix = "10.0.0.0/16" $SingleSubnet = New-AzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $SubnetAddressPrefix $Vnet = New-AzVirtualNetwork -Name $NetworkName -ResourceGroupName $ResourceGroupName -Location $LocationName -AddressPrefix $VnetAddressPrefix -Subnet $SingleSubnet } $Credential = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword); $VMName = "xxxx" + $WeekNo ##New-AzVM -ResourceGroupName $ResourceGroupName -Location $LocationName -VM $VirtualMachine -Verbose -Image $image for($i=1; $i -le $VmCount; $i++){ $VMBaseName = "iCPSEDU" + $WeekNo + $i $StorageAccount = "xxxxx" + $WeekNo + $i $PublicIPAddressName = $VMBaseName + "PIP$(Get-Random)" $NICName = $VMBaseName + "NIC" $DNSNameLabel = "xxxx" + $WeekNo + $i + "dns" # mydnsname.westus.cloudapp.azure.com $PIP = New-AzPublicIpAddress -Name $PublicIPAddressName -DomainNameLabel $DNSNameLabel -ResourceGroupName $ResourceGroupName -Location $LocationName -AllocationMethod Dynamic $NIC = New-AzNetworkInterface -Name $NICName -ResourceGroupName $ResourceGroupName -Location $LocationName -SubnetId $Vnet.Subnets[0].Id -PublicIpAddressId $PIP.Id Write-Host "Creating VM " $VMBaseName New-AzVm ` -ResourceGroupName $ResourceGroupName ` -Name $VMBaseName ` -ImageName $image ` -Location $LocationName ` -VirtualNetworkName $Vnet ` -SubnetName $SubnetName ` -SecurityGroupName "myImageNSG" ` -PublicIpAddressName $PIP -Credential $Credential -Size $VMSize -PublicIpSku Standard Write-Host "VM " $VMBaseName " Created" Stop-AzVM -ResourceGroupName $ResourceGroupName $VMBaseName -Force -NoWait Write-Host "VM " $VMBaseName " Stopped" } Write-Host "Done."
问题原因及解决方案
核心问题
- 参数类型错误:
New-AzVm的-PublicIpAddressName参数需要传入公共IP资源的名称字符串,但你传入的是$PIP(PSPublicIpAddress对象),导致Azure在处理第二台VM时,错误地试图复用已绑定到第一台NIC的IP对象。 - 重复创建网络资源:你已经手动创建了NIC并绑定了PIP,但
New-AzVm又指定了-VirtualNetworkName、-SubnetName等参数,会触发命令自动创建新的网络资源,和你手动创建的资源冲突。
修改后的循环代码
for($i=1; $i -le $VmCount; $i++){ $VMBaseName = "iCPSEDU" + $WeekNo + $i $StorageAccount = "xxxxx" + $WeekNo + $i $PublicIPAddressName = $VMBaseName + "PIP$(Get-Random)" $NICName = $VMBaseName + "NIC" $DNSNameLabel = "xxxx" + $WeekNo + $i + "dns" # 创建公共IP(指定Sku与后续VM参数匹配) $PIP = New-AzPublicIpAddress -Name $PublicIPAddressName -DomainNameLabel $DNSNameLabel -ResourceGroupName $ResourceGroupName -Location $LocationName -AllocationMethod Dynamic -Sku Standard # 创建NIC并绑定IP、NSG $NIC = New-AzNetworkInterface -Name $NICName -ResourceGroupName $ResourceGroupName -Location $LocationName -SubnetId $Vnet.Subnets[0].Id -PublicIpAddressId $PIP.Id -NetworkSecurityGroupName "myImageNSG" Write-Host "Creating VM " $VMBaseName # 直接关联已创建的NIC,避免重复生成网络资源 New-AzVm ` -ResourceGroupName $ResourceGroupName ` -Name $VMBaseName ` -ImageName $image ` -Location $LocationName ` -NetworkInterfaceName $NICName ` -Credential $Credential ` -Size $VMSize Write-Host "VM " $VMBaseName " Created" # 修正Stop-AzVM参数,明确指定VM名称 Stop-AzVM -ResourceGroupName $ResourceGroupName -Name $VMBaseName -Force -NoWait Write-Host "VM " $VMBaseName " Stopped" }
修改说明
- 移除
New-AzVm中的冗余网络参数,改用-NetworkInterfaceName $NICName直接关联手动创建的NIC,避免命令重复生成网络资源。 - 在创建NIC时直接绑定NSG,确保安全组配置生效。
- 修正
Stop-AzVM的参数格式,添加-Name参数保证VM停止指令准确。
内容的提问来源于stack exchange,提问作者user3008586
相关产品推荐
相关产品推荐

