我使用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关闭吗?我不这么认为,这是对其他命令更为重要的检查。但现在我想知道。
我尝试搜索并发现它在几个不相关的代码示例中使用,但我一直无法找到解释。
答案 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
因此,总而言之,我说在脚本执行过程中,为了避免无意义/不可能的操作,这是一个非常简单的脚本编写。