2

我正在使用 powershell 自动化 Azure 虚拟机,只是按计划启动和停止一台机器。我以前做过,但是我遇到了这个代码片段,它有一个额外的步骤,我想确保我没有遗漏一些重要的东西:

# Shutdown VM(s)
$vmList = ('VM1', 'VM2', 'VM3')
$svcName = 'servicename'

For ( $vmCount = 0; $vmCount -lt $vmList.Count; $vmCount++) {

    $vm = Get-AzureVM `
        -ServiceName $svcName `
        -Name $vmList[$vmCount]

    if ( $vm.InstanceStatus -eq 'ReadyRole' ) {

        Stop-AzureVM `
            -ServiceName $vm.ServiceName `
            -Name $vm.Name `
            -Force                 
    }     
}  

所以我会直接调用 Stop-AzureVM... InstanceStatus 检查是做什么的?比如说,如果虚拟机正在安装更新,它会阻止它关闭吗?我在想不,这是一个对其他命令更重要的检查。但现在我想知道。

我尝试四处搜索,发现它在几个不相关的代码示例中使用,但我一直找不到解释。

4

1 回答 1

3

ReadyRole是 Azure VM 的稳定状态。它本质上意味着它没有启动、停止、配置、转换、停止等。

对我来说,我认为这条线$vm.InstanceStatus -eq 'ReadyRole'只是对机器状态的基本检查。如果您在虚拟机忙于做某事时尝试关闭或在虚拟机上运行任何其他命令,您的命令无论如何都会失败并出现错误。

在从 Web 管理控制台启动 VM 后,我刚刚运行了一个尝试停止 VM 的测试,这就是我收到的结果:

stop-azurevm : ConflictError: Windows Azure is currently performing an operation with x-ms-requestid
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx on this deployment that requires exclusive access.
At line:1 char:1

在这种情况下,这是因为状态很可能starting

但是,一旦 VM 停止,发出另一个停止命令(虽然愚蠢)可以正常工作,不会出现任何明显问题。

PS > get-azurevm
ServiceName                             Name                                    Status
-----------                             ----                                    ------
vm                              cloudservice                           StoppedDeallocated

PS > stop-azurevm -servicename cloudservice -name vm
OperationDescription                    OperationId                             OperationStatus
--------------------                    -----------                             ---------------
Stop-AzureVM                            xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    Succeeded

所以,总而言之,我想说的是,在脚本执行过程中避免无意义/不可能的操作是一个整洁的脚本编写工作。

于 2014-05-09T13:57:18.560 回答