我正在尝试为大型作业生成1000个Azure VM(是的,我知道成本)。这是在PowerShell脚本(请参见下面的脚本)中异步完成的,因此在等待所有VM启动时不会产生费用。
在脚本中,如果脚本运行时包含Wait-Job
和Receive-Job
,则会创建所有请求的VM,但如果Wait-Job
和Receive-Job
被注释掉,则所有VM都是没有创建。似乎随机创建了什么VM。
任何人都可以看到我在使用这个脚本时遇到了什么问题吗?
$VMCount = 5
$Location = 'East US'
$Image = 'MyImage'
$AdminPassword = 'XXXXXXXXXX'
$LinuxUser = 'MyUser'
$InstanceSize = 'ExtraSmall' #extra small only for testing
$CloudServiceName = 'NewAzureMachinePrefix' #this is changed each time to something unique
for ($i = 1; $i -le $VMCount; $i++)
{
$jobId = Start-Job -ArgumentList $CloudServiceName$i, $Location, $Image, $AdminPassword, $LinuxUser, $InstanceSize -ScriptBlock {
param($ServiceName, $Loc, $Img, $Password, $User, $Size)
New-AzureVMConfig -Name $ServiceName -InstanceSize $Size -ImageName $Img |
Add-AzureProvisioningConfig -Linux -LinuxUser $User -Password $Password |
Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -DiskLabel $ServiceName -LUN 0 |
Remove-AzureEndpoint 'SSH' |
Add-AzureEndpoint -Protocol tcp -PublicPort 22 -LocalPort 22 -Name 'SSH' |
Set-AzureSubnet 'MySubnet' |
New-AzureVM -ServiceName $ServiceName -AffinityGroup 'MyGroup' -VNetName 'MyNet'
}
Write-Output $CloudServiceName$i
Wait-Job $jobId
Receive-Job $jobId
}
答案 0 :(得分:2)
我发现了来自Microsoft Rep的几封电子邮件后发生的事情。使用Affinity Group和/或Virtual Network在Azure中创建新虚拟机时,会创建一个独占锁。此独占锁不允许多个请求访问关联组和/或虚拟网络。
答案 1 :(得分:1)
您是否尝试将等待作业移至for循环之外?我猜你知道,通过把它放在那里,你可以让它同步运行。
以下将等待所有工作:
Get-Job | Wait-Job
Get-Job | Receive-Job
Receive-Job应该为你提供一些线索,说明为什么有些人没有被创建。