Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure资源组中的并行处理_Azure_Azure Resource Manager - Fatal编程技术网

Azure资源组中的并行处理

Azure资源组中的并行处理,azure,azure-resource-manager,Azure,Azure Resource Manager,例如,我在一个资源组中有3个虚拟机 我想并行启动这些虚拟机 比如说,1个虚拟机需要3分钟才能启动,所以3个虚拟机需要9分钟。现在我希望这些虚拟机并行启动,这样在大约3分钟内所有3个虚拟机都应该启动 经过多次研发,我没有找到任何解决方案 谢谢。您可以使用开始作业和等待作业来实现此功能。下面是一个PowerShell脚本 $cred = Get-Credential $VMs = @(@{"Name"="vm1";"ServiceName"="srv1"};@{"Name"="vm2";"Servi

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

我想并行启动这些虚拟机

比如说,1个虚拟机需要3分钟才能启动,所以3个虚拟机需要9分钟。现在我希望这些虚拟机并行启动,这样在大约3分钟内所有3个虚拟机都应该启动

经过多次研发,我没有找到任何解决方案


谢谢。

您可以使用
开始作业
等待作业
来实现此功能。下面是一个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

我试着运行这个脚本,但是看起来VM在一个循环中一个接一个地启动,为什么我必须为每个循环登录AzureRmAccount???你怎么知道虚拟机一个接一个地启动?你在传送门上看到了吗?我已经用
Login-AzureRmAccount
在循环外部测试了一个脚本,但它只适用于第一个VM。您可以看到,
Login AzureRmAccount
被try-And-catch包围,因此,如果它已经登录,它将不会再次登录。您必须在每个作业中登录AzureRmAccount,因为每个作业都在一个单独的进程中(需要它自己的authn)。PS并非总是以这种方式工作,但在新的1.x cmdlet中确实如此。因此,在那里尝试/捕获可能是不必要的…@JackZeng非常感谢。我已经完成了我想要的。:)@谢谢!!我得到了它。