识别并删除重复Azure Hybrid Worker,保留最新注册实例
解决Azure Hybrid Worker重复实例的清理方案
核心思路
按服务器FQDN($SHRW.WorkerName)分组,每组内按RegisteredDateTime降序排序,保留最新注册的实例,其余标记为待删除项,批量执行删除操作。
具体实现步骤
- 按FQDN分组Hybrid Worker
将已获取的所有Hybrid Worker列表按服务器FQDN分组,方便后续处理重复项:
# 按WorkerName(FQDN)分组 $groupedWorkers = $BigListOfSHRWGs | Group-Object -Property WorkerName
- 筛选待删除的重复实例
遍历每个分组,对组内实例按注册时间从新到旧排序,跳过第一个(最新实例),剩余的就是需要清理的重复项:
$workersToDelete = foreach ($group in $groupedWorkers) { # 按注册时间降序排序,确保最新实例排在首位 $sortedWorkers = $group.Group | Sort-Object -Property RegisteredDateTime -Descending # 跳过第一个保留实例,收集其余重复项 $sortedWorkers | Select-Object -Skip 1 }
- 执行删除操作
根据你使用的工具选择对应的删除方式:
方式一:使用Azure PowerShell模块(Az.Automation)
# 替换为你的资源组和自动化账户名称 $resourceGroupName = "YourResourceGroup" $automationAccountName = "YourAutomationAccount" foreach ($worker in $workersToDelete) { # 从Id中提取Worker的唯一名称($SHRW.Id.split("/")[10]) $workerUniqueName = $worker.Id.Split("/")[10] # 执行删除,-Force参数跳过确认提示 Remove-AzAutomationHybridRunbookWorker ` -ResourceGroupName $resourceGroupName ` -AutomationAccountName $automationAccountName ` -Name $workerUniqueName ` -Force Write-Host "已清理重复实例: $($worker.WorkerName) - $workerUniqueName" }
方式二:调用Azure Management API
如果你之前是通过API获取的Hybrid Worker数据,可以直接用API执行删除:
# 确保已获取有效的Azure访问令牌 $accessToken = "YourValidAccessToken" $apiBaseUrl = "https://management.azure.com" foreach ($worker in $workersToDelete) { # 从Worker的Id中提取API路径 $workerApiPath = $worker.Id.Substring($worker.Id.IndexOf("/subscriptions/")) $deleteApiUrl = "$apiBaseUrl$workerApiPath`?api-version=2023-11-01" # 发送删除请求 Invoke-RestMethod -Uri $deleteApiUrl -Method Delete -Headers @{ Authorization = "Bearer $accessToken" "Content-Type" = "application/json" } Write-Host "已通过API清理重复实例: $($worker.WorkerName) - $($worker.Id.Split("/")[10])" }
关键注意事项
- 先验证再删除:建议先将删除代码替换为
Write-Host输出待删除实例信息,确认无误后再执行实际删除操作,避免误删有效实例。 - 权限要求:执行脚本的账户需要拥有
Microsoft.Automation/automationAccounts/hybridRunbookWorkers/delete权限。 - 可选过滤条件:如果只想清理断开连接(Disconnected)的重复项,可以在分组前添加过滤:
$filteredWorkers = $BigListOfSHRWGs | Where-Object { $_.ConnectionState -eq "Disconnected" } $groupedWorkers = $filteredWorkers | Group-Object -Property WorkerName
内容的提问来源于stack exchange,提问作者Bombbe
相关产品推荐
相关产品推荐

