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
相关产品推荐
相关产品推荐

