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

mit*_*uis 5 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 
        } 
    }
Run Code Online (Sandbox Code Playgroud)

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

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

脚本不会关闭 VM2,直到 VM1 完全关闭,依此类推。我不知道是否有办法告诉 PowerShell 不要等待每个 VM 完全关闭才能继续执行以下操作。

DAX*_*lic 3

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))
Run Code Online (Sandbox Code Playgroud)

在我使用 3 个虚拟机的测试用例中,输出类似于以下内容,表明操作是并行完成的

# 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))
Run Code Online (Sandbox Code Playgroud)

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