2013-05-03 78 views
2

我正在尝试为大型作业生成1000个Azure虚拟机(是的,我知道成本)。这是在PowerShell脚本中完成的(参见下面的脚本),所以在等待所有虚拟机启动时不会发生费用。在PowerShell中创建Azure虚拟机异步

在脚本如果Wait-JobReceive-Job包括当脚本运行的所有虚拟机要求创建的,但如果Wait-JobReceive-Job被注释掉根本没有创建虚拟机。看起来随机的虚拟机正在创建。

任何人都可以看到我做错了这个脚本?

$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 
} 

回答

2

我想通过我们的微软代表发送几封电子邮件后发生了什么事情当在Azure中使用Affinity Group和/或Virtual Network创建新的虚拟机时,将创建排它锁。这种独占锁定不允许多个请求访问Affinity Group和/或虚拟网络。

+0

您是否能够想出一个不需要Wait-Job的解决方案? – Glenn 2014-11-04 15:44:18

+1

脚本块(Start-Job)中的代码为您创建虚拟机。您不需要运行Wait-Job和Receive-Job来创建虚拟机。 – 2014-11-04 20:23:51

+0

谢谢。但是,在连续创建多个虚拟机时,锁定虚拟网络还存在问题吗?我了解到,由于独占锁定,一些工作并未成功完成。您是否修改了脚本以处理失败的作业,直到它们全部完成? – Glenn 2014-11-05 22:04:06

1

您是否尝试将等待工作移至for循环之外?我猜你知道,通过把它放在那里,你可以使它同步运行。

下面将等待所有作业:

Get-Job | Wait-Job 
Get-Job | Receive-Job 

接收在职应该给你一些没有被创建,为什么一些线索。