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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:27:38