Azure资源组中的并行处理

时间:2016-02-01 15:27:48

标签: azure azure-resource-manager

例如,我在资源组中有3个虚拟机。

我想并行启动这些虚拟机。

可以说,1个虚拟机需要3分钟才能启动,因此3个虚拟机需要9分钟。现在我希望这些虚拟机并行启动,这样大约3分钟就可以启动所有3个虚拟机。

经过多次R& D我没有找到任何解决方案。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用Start-JobWait-Job来实现此目的。这是适合您的PowerShell脚本。

$cred = Get-Credential
$VMs = @(@{"Name"="vm1";"ServiceName"="srv1"};@{"Name"="vm2";"ServiceName"="srv2"};@{"Name"="vm3";"ServiceName"="srv3"})
$jobs = @()
foreach ($vm in $VMs) 
{ 
    $params = @($vm.Name, $vm.ServiceName, $cred) 
    $job = Start-Job -ScriptBlock { 
        param($Name, $ServiceName, $cred) 
        try{
            $acct = Get-AzureRmSubscription
        }
        catch{
            Login-AzureRmAccount -Credential $cred
        }
        start-AzureVM -Name $Name -ServiceName $ServiceName 
    } -ArgumentList $params  
    $jobs = $jobs + $job 
} 
Wait-Job -Job $jobs
Get-Job | Receive-Job

以上代码适用于经典部署的VM。如果您使用的是ARM部署,则可以使用以下脚本。

$cred = Get-Credential
$VMs = @(@{"Name"="vm1";"ResourceGroupName"="rg1"};@{"Name"="vm2";"ResourceGroupName"="rg2"};@{"Name"="vm3";"ResourceGroupName"="rg3"})
$jobs = @()
foreach ($vm in $VMs) 
{ 
    $params = @($vm.Name, $vm.ResourceGroupName, $cred) 
    $job = Start-Job -ScriptBlock { 
        param($Name, $ResourceGroupName, $cred) 
        try{
            $acct = Get-AzureRmSubscription
        }
        catch{
            Login-AzureRmAccount -Credential $cred
        }
        start-AzureRmVM -Name $Name -ResourceGroupName $ResourceGroupName 
    } -ArgumentList $params  
    $jobs = $jobs + $job 
} 
Wait-Job -Job $jobs
Get-Job | Receive-Job