Azure孤立可用性集按Owner合并邮件的PowerShell逻辑优化
按Owner合并孤立可用性集的邮件通知方案
问题说明
你当前的PowerShell脚本能成功抓取Azure中无关联VM的孤立可用性集,并通过资源组的Owner标签获取所有者,但存在一个问题:同一Owner名下有多个孤立可用性集时,会触发多封邮件。需要调整逻辑,将同一Owner的所有资源合并到单封邮件中发送。
核心解决思路
- 先批量收集所有孤立可用性集的完整信息(含Owner),存入统一集合
- 用
Group-Object按Owner字段分组,将同一Owner的资源聚合为一组 - 遍历每个分组,为每个Owner生成包含其所有资源的邮件内容
修改后的完整脚本
# 初始化集合存储所有孤立可用性集信息 $allOrphanedResources = @() # 指定要检查的订阅ID,可替换为Get-AzSubscription获取所有订阅 $subscriptionids = "subids" foreach($subscriptionid in $subscriptionids){ Select-AzSubscription -Subscription $subscriptionid # 使用Azure Graph查询孤立可用性集 $asQuery = @" resources | where type has 'Microsoft.Compute/availabilitySets' | where properties.virtualMachines == '[]' | project ResourceGroup=resourceGroup, Name=name, Type=type "@ $orphanedSets = Search-AzGraph -Subscription $subscriptionid -Query $asQuery foreach($set in $orphanedSets){ # 获取资源组的Owner标签 $rg = Get-AzResourceGroup -Name $set.ResourceGroup $owner = $rg.Tags.Owner # 构造资源对象并加入集合 $resourceObj = [PSCustomObject]@{ Resources = $set.Name RGname = $set.ResourceGroup ResourceType = $set.Type Owner = $owner } $allOrphanedResources += $resourceObj } } # 按Owner分组 $groupedByOwner = $allOrphanedResources | Group-Object -Property Owner # 遍历每个Owner分组,生成邮件内容(此处仅示例内容构造,需结合你的邮件发送逻辑) foreach($ownerGroup in $groupedByOwner){ if(-not [string]::IsNullOrEmpty($ownerGroup.Name)){ $ownerEmail = $ownerGroup.Name # 假设Owner标签是邮箱,可根据实际调整 $resourcesList = $ownerGroup.Group | Format-Table -AutoSize | Out-String # 构造邮件主题和正文 $mailSubject = "你的Azure账户下存在孤立可用性集" $mailBody = @" 以下是你负责的资源组中的孤立可用性集(无关联虚拟机): $resourcesList 请及时核查处理。 "@ # 此处替换为你的邮件发送逻辑,例如Send-MailMessage或Azure自动化邮件模块 # Send-MailMessage -To $ownerEmail -Subject $mailSubject -Body $mailBody -From "your-alert@domain.com" -SmtpServer "smtp.domain.com" Write-Host "准备发送邮件至 $ownerEmail`n邮件内容:`n$mailBody`n" } }
关键修改点
- 将单条资源对象收集改为批量存入
$allOrphanedResources集合,避免循环覆盖数据 - 使用
Group-Object -Property Owner实现按所有者分组,聚合同一Owner的所有资源 - 针对每个分组生成统一的邮件内容,确保同一Owner仅收到一封邮件
内容的提问来源于stack exchange,提问作者Rakesh Chaudhari
相关产品推荐
相关产品推荐

