根据标记和当前电源状态取消分配 Azure VMSS

Deallocate Azure VMSS based on tag and current powerstate

我正在尝试获取具有特定标签且仍然 powered/allocated 的 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"
        }

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

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

我们对它进行了一些更改,而不是在您的脚本中对 ResourcegroupName 进行硬编码。

此新脚本将验证实例状态是否 运行。如果实例处于 运行 状态,则脚本将触发 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"
        }

    }
}

这里是示例输出以供参考: