Azure资源组中的并行处理
例如,我在一个资源组中有3个虚拟机 我想并行启动这些虚拟机 比如说,1个虚拟机需要3分钟才能启动,所以3个虚拟机需要9分钟。现在我希望这些虚拟机并行启动,这样在大约3分钟内所有3个虚拟机都应该启动 经过多次研发,我没有找到任何解决方案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
谢谢。您可以使用
开始作业
和等待作业
来实现此功能。下面是一个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非常感谢。我已经完成了我想要的。:)@谢谢!!我得到了它。