使用Azure PowerShell同时停止多个Azure VM

时间:2016-09-24 13:26:56

标签: azure azure-virtual-machine azure-powershell azure-resource-manager

Get-AzureRmVM -ResourceGroupName RG-VNETS | 
    ForEach-Object { 
        Get-AzureRmVM -ResourceGroupName RG-VNETS -Name $_.Name -Status 
    } | 
    ForEach-Object { 
        if (-Not ($_.Statuses[1].DisplayStatus -like "*deallocated*")) { 
            Stop-AzureRmVM -ResourceGroupName RG-VNETS -Name $_.Name -Force 
        } 
    }

我有这个脚本可以阻止我的所有Azure VM,这里的问题是这个脚本一次关闭一个VM。

即。如果我有三个虚拟机:VM1,VM2,VM3

在VM1完全关闭之前,脚本不会关闭VM2,依此类推。我不知道是否有办法告诉PowerShell不要等待每个VM完全关闭以继续下面的操作。

2 个答案:

答案 0 :(得分:2)

GitHub上已经有feature request用于异步执行此类操作,应该在不久的将来实现。

与此同时,您可以使用PoshRSJob模块执行以下解决方法 - 只需将temp4so替换为您的资源组名称

# Install PoshRSJob if necessary
#
# Install-Module PoshRSJob

Login-AzureRmAccount    

$start = Get-Date
$jobs = Get-AzureRmVM -ResourceGroupName temp4so | 
    % { 
        Get-AzureRmVM -ResourceGroupName temp4so -Name $_.Name -Status 
    } | 
    % { 
        if (-Not ($_.Statuses[1].DisplayStatus -like "*deallocated*")) { 
            $vm = $_
            Start-RSJob {               
                Stop-AzureRmVM -ResourceGroupName temp4so -Name ($using:vm).Name -Force
            }
        }
    }
$jobs | Wait-RSJob | Receive-RSJob
$jobs | Remove-RSJob
$end = Get-Date
Write-Host ("Stopping took {0}" -f ($end - $start))

在我的测试用例中有3个VM导致输出类似于以下显示并行完成的操作

OperationId : 
Status      : Succeeded
StartTime   : 24.09.2016 18:49:10
EndTime     : 24.09.2016 18:51:32
Error       : 

OperationId : 
Status      : Succeeded
StartTime   : 24.09.2016 18:49:11
EndTime     : 24.09.2016 18:51:22
Error       : 

OperationId : 
Status      : Succeeded
StartTime   : 24.09.2016 18:49:11
EndTime     : 24.09.2016 18:51:22
Error       : 

Stopping took 00:02:32.9115538

注意:您不能简单地使用标准Start-Job来卸载同步。对后台作业的操作,因为后台新创建的PowerShell实例不与初始会话共享上下文,因此需要您为每个会话再次进行身份验证。由于PoshRSJob在初始PowerShell实例中使用PowerShell运行空间,因此不需要再次进行身份验证。

答案 1 :(得分:0)

他们根据GitHub功能请求DAXaholic链接实现了-AsJob。这是取自GitHub评论部分的示例。

$VMList = Get-AzureRmVM -ResourceGroupName $resourceGroupName
$JobList = @()
foreach ($vm in $VMList) {
  $JobList += Stop-AzureRmVm -ResourceGroupName $resourceGroupName -Name $vm -Force -AsJob | Add-Member -MemberType NoteProperty -Name VMName -Value $vm.Name -PassThru
}

,如果您要等待作业完成cleanip:

$JobList | Wait-Job | Receive-Job
$JobList | Remove-Job