You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure订阅下100台非VMSS工作站VM自动化启停需求

Azure 独立VM自动化启停降本方案

针对你提到的100台独立Azure VM工作站的自动化需求,可通过Azure自动化账户(Automation Account) + PowerShell运行手册(Runbook) + Azure Monitor 组合实现,以下是分步骤的具体方案:


1. 检测VM闲置及无用户连接状态

核心逻辑

  • 闲置状态判定:通过Azure Monitor采集CPU使用率,若持续30分钟低于5%(可自定义阈值),判定为闲置
  • 无用户连接判定:Windows VM查询远程桌面会话状态,Linux VM查询终端登录会话状态

实现代码(PowerShell Runbook)

# 初始化变量
$idleVms = @()
$idleCpuThreshold = 5 # CPU使用率阈值(%)
$idleDuration = 30 # 持续闲置时长(分钟)

# 获取订阅下所有VM
$allVms = Get-AzVM

foreach ($vm in $allVms) {
    # 查询CPU使用率指标
    $cpuMetrics = Get-AzMetric -ResourceId $vm.Id `
        -MetricName "Percentage CPU" `
        -TimeGrain 00:05:00 `
        -StartTime (Get-Date).AddMinutes(-$idleDuration)
    
    $avgCpu = ($cpuMetrics.Data.Average | Measure-Object -Average).Average
    if ($avgCpu -lt $idleCpuThreshold) {
        # 检查用户连接状态(Windows示例:查询RDP会话)
        $sessionResult = Invoke-AzVMRunCommand -ResourceGroupName $vm.ResourceGroupName `
            -VMName $vm.Name `
            -CommandId 'RunPowerShellScript' `
            -ScriptString "query user 2>&1"
        
        # 无活跃会话则标记为目标VM
        if ($sessionResult.Value.Message -notmatch "Active") {
            $idleVms += $vm
        }
    }
}

Linux VM可将脚本替换为who 2>&1,通过判断输出是否为空来确认无用户连接


2. 自动关闭50%符合条件的VM并发送告警邮件

核心逻辑

  • 从闲置无连接VM列表中随机选取50%进行关闭(避免集中关闭特定VM)
  • 关闭完成后,向管理员发送包含VM列表的通知邮件

实现代码(续上一段Runbook)

# 计算需关闭的VM数量
$closeCount = [math]::Floor($idleVms.Count * 0.5)
if ($closeCount -gt 0) {
    # 随机选取待关闭VM
    $vmsToClose = $idleVms | Get-Random -Count $closeCount
    
    # 批量关闭VM
    foreach ($vm in $vmsToClose) {
        Stop-AzVM -ResourceGroupName $vm.ResourceGroupName `
            -Name $vm.Name `
            -Force `
            -Confirm:$false
    }
    
    # 发送通知邮件(需提前配置自动化账户SMTP凭据)
    $smtpCred = Get-AutomationPSCredential -Name "SmtpCredential"
    $mailBody = "已自动关闭以下$closeCount台闲置无连接VM:`n`n$($vmsToClose.Name -join "`n")"
    
    Send-MailMessage -To "admin@yourcompany.com" `
        -From "azure-automation@yourcompany.com" `
        -Subject "Azure VM自动关闭通知" `
        -Body $mailBody `
        -SmtpServer "smtp.yourcompany.com" `
        -Port 587 `
        -UseSsl `
        -Credential $smtpCred
}

3. VM使用量达90%时自动启动VM

核心逻辑

  • 以「运行中VM数量/总VM数量」作为使用率判定标准,达到90%时启动指定数量VM
  • 优先从之前关闭的闲置VM中选取启动对象

实现代码(续上一段Runbook)

$totalVmsCount = 100
$usageThreshold = 0.9 # 90%使用率阈值
$startCount = 5 # 每次启动VM数量(可自定义)

# 获取当前运行中VM数量
$runningVms = Get-AzVM | Where-Object {$_.PowerState -eq "VM running"}
$runningCount = $runningVms.Count

if ($runningCount / $totalVmsCount -ge $usageThreshold) {
    # 获取已关闭的闲置VM
    $stoppedIdleVms = Get-AzVM | Where-Object {
        $_.PowerState -eq "VM deallocated" -and $_.Name -in $idleVms.Name
    }
    
    if ($stoppedIdleVms.Count -ge $startCount) {
        $vmsToStart = $stoppedIdleVms | Get-Random -Count $startCount
        
        # 批量启动VM
        foreach ($vm in $vmsToStart) {
            Start-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name
        }
        
        # 发送启动通知邮件
        $startMailBody = "VM使用率已达$([math]::Round(($runningCount/$totalVmsCount)*100))%,已自动启动以下$startCount台VM:`n`n$($vmsToStart.Name -join "`n")"
        
        Send-MailMessage -To "admin@yourcompany.com" `
            -From "azure-automation@yourcompany.com" `
            -Subject "Azure VM自动启动通知" `
            -Body $startMailBody `
            -SmtpServer "smtp.yourcompany.com" `
            -Port 587 `
            -UseSsl `
            -Credential $smtpCred
    }
}

关键配置注意事项

  • 权限配置:自动化账户需分配「VM参与者」「Monitor读取者」权限,确保能操作VM并读取监控数据
  • 触发方式:可将Runbook设置为每1小时定时触发,或通过Azure Monitor警报触发(比如运行中VM数达到90%时立即启动Runbook)
  • 阈值自定义:可根据业务需求调整CPU闲置阈值、时长、关闭比例、启动数量等参数

内容的提问来源于stack exchange,提问作者web.curious.gk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:01:29