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

标签 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 不要等待每个虚拟机完全关闭才能继续进行下一个。

最佳答案

已经有一个 feature request在 GitHub 上可以异步执行此类操作,这应该会在不久的将来实现。

同时,您可以使用 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 个虚拟机测试用例中,输出类似于以下内容,表明操作是并行完成的

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 实例不与您的初始 session 共享上下文,因此需要您对每个 session 再次进行身份验证。由于 PoshRSJob 在初始 PowerShell 实例中使用 PowerShell 运行空间,因此不需要再次进行身份验证。

关于azure - 使用 Azure PowerShell 同时停止多个 Azure VM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39676841/

相关文章:

azure - 为什么每个 azure 客户端 ID 都有多个客户端 key ?

Azure函数无法访问Azure Blob

azure - 非托管 win32 dll 未加载到 IIS 8.5、Win Server 2012 R2、Azure 虚拟机上的 .net MVC 应用程序中

azure - 从 Azure Cloud Shell 显示所有 Azure Web Apps 自定义域的列表

json - 通过 ARM 模板将子网添加到现有 Vnet

c# - 如果在某个间隔时间内没有任何操作,Microsoft azure 应用程序服务(MVC C# Web API)将进入休眠状态

javascript - Azure 在隐式流程登录期间使用错误的回调 URL

Azure:无法通过 RDP 访问另一个分支虚拟网络中的 VM

Azure:列出操作系统镜像

azure - 如何删除 Azure Active Directory 上的 guest 用户?