根据标记和当前电源状态解除分配 Azure VMSS

Posted

技术标签:

【中文标题】根据标记和当前电源状态解除分配 Azure VMSS【英文标题】:Deallocate Azure VMSS based on tag and current powerstate 【发布时间】:2022-01-18 06:20:27 【问题描述】:

我正在尝试获取具有特定标签且仍处于供电/分配状态的 VMSS 列表,然后解除分配这些 VMSS。

我在Get-AzVmss 中没有看到显示 VMSS 的分配或电源状态的属性。

但我确实发现,如果我自己深入研究实例,我可以使用 Get-AzVmssVM 获得它们的电源状态

我能够成功地在实例级别发生这种情况并关闭实例,但我想释放 VMSS 本身。

这将成为 DevOps 部署管道的一部分,因此我需要确保它可靠且一致。它将作为 Azure Powershell 任务运行。

任何人都可以帮助我在这里缺少什么?我很想在一个层次上做这件事,甚至不进入实例,但我不知道该怎么做(假设它是可能的)。

这是我目前的代码:

$RedTagValue = "Red"
$RGName = "test-rg"
$Resources = Get-AzVmss -ResourceGroupName $RGName | Where-Object  $_.Tags.Values -eq $RedTagValue 

foreach ($Resource in $Resources) 
    $vmss = Get-AzVmssVM -ResourceGroupName $RGName -VMScaleSetName $Resource.Name
    foreach ($vm in $vmss) 
        
        $instances = Get-AzVmssVM -ResourceGroupName $RGName -VMScaleSetName $Resource.Name -InstanceId $vm.InstanceId -InstanceView

        if ($instances.Statuses[1].Code -notcontains "PowerState/deallocated") 
            Write-Output "Turning off" #Need some code here to output the VMSS that are being turned off and also some logic to turn them off
        
        else 
            Write-Output "No Machines to turn Off"
        

    

【问题讨论】:

【参考方案1】:
Stop-AzVmss -ResourceGroupName $RGName -VMScaleSetName $Resource.Name -InstanceId $vm.InstanceId -Force

您需要在脚本的If 块中添加上述stop-azvmss cmdlet 以停止特定的vmss 实例。

我们没有在您的脚本中硬编码资源组名称,而是对其进行了一些更改。

这个新脚本将验证实例状态是否正在运行。如果实例处于运行状态,则脚本将触发 stop-azvmss cmdlet 以释放这些实例。

这是修改后的 PowerShell 脚本:

     $RedTagValue = "Red"
$Resources = Get-AzVmss| Where-Object  $_.Tags.Values -eq $RedTagValue 

foreach ($Resource in $Resources) 
    $vmss = Get-AzVmssVM -ResourceGroupName $Resources.ResourceGroupName -VMScaleSetName $Resource.Name
    foreach($vm in $vmss)

        $instanceId=Get-AzVmssVM -ResourceGroupName $Resources.ResourceGroupName -VMScaleSetName $Resource.Name -InstanceId $vm.InstanceId -InstanceView 
        if($instanceId.Statuses[1].Code -eq 'PowerState/running')
            
            Write-Host "Turnning OFF","$($vm.Name)"

            Stop-AzVmss -ResourceGroupName $Resources.ResourceGroupName -VMScaleSetName $Resource.Name -InstanceId $vm.InstanceId -Force

        else 

        Write-Host "$($Resource.Name)","Virtual Machines are already turned off"
        

    

这是示例输出供参考:

【讨论】:

感谢您的回复。我确实喜欢你在那里获得资源组的方式。我想我的问题是关闭 VMSS 中的所有实例也会释放 VMSS 本身吗?我的最终目标是不仅要释放 VMSS 的实例,还要释放 VMSS。 根据我的调查,停止所有实例将释放 VMSS 本身。 我也做了一些测试,它似乎确实解除了 VMSS 的分配,但是如果您有任何扩展到特定实例计数的自动缩放资源附加,这些资源仍然会触发。所以我想我可以使用你的方法,并在同一步骤中从 VMSS 中删除自动缩放资源,我相信这将符合我的目的。感谢您的帮助

以上是关于根据标记和当前电源状态解除分配 Azure VMSS的主要内容,如果未能解决你的问题,请参考以下文章

Azure Synapse:Spark 作业定义中指定的目标 Spark 池未处于成功状态。当前状态:供应

永久数据存储 Azure VM

获取当前 USB 电源状态

Azure基础:何时使用Azure Functions无服务器计算(11)

了解 Azure 中的无服务器计算

AFHTTPSessionManager 未解除分配