在启动或停止azure VM之前,是否需要检查instancestatus?

时间:2014-05-09 13:33:34

标签: powershell azure automation virtual-machine azure-powershell

我使用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的检查有什么作用?比方说,如果它正在安装更新的过程中阻止VM关闭吗?我不这么认为,这是对其他命令更为重要的检查。但现在我想知道。

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

1 个答案:

答案 0 :(得分:3)

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

对我而言,我认为行$vm.InstanceStatus -eq 'ReadyRole'只是对机器状态的基本检查。如果您尝试关闭VM,或者在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

但是,一旦虚拟机停止运行,发出另一个停止命令(同时愚蠢)的工作没有任何明显的问题。

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

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

因此,总而言之,我说在脚本执行过程中,为了避免无意义/不可能的操作,这是一个非常简单的脚本编写。