You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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."

问题原因及解决方案

核心问题

  1. 参数类型错误:New-AzVm的-PublicIpAddressName参数需要传入公共IP资源的名称字符串,但你传入的是$PIP(PSPublicIpAddress对象),导致Azure在处理第二台VM时,错误地试图复用已绑定到第一台NIC的IP对象。
  2. 重复创建网络资源:你已经手动创建了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:40:42