Azure VM标签被批量覆盖如何通过PowerShell/CLI导出数据恢复旧标签
Azure VM批量标签恢复方案
可以直接通过PowerShell、CLI调用Azure Change Analysis的开放接口批量导出历史标签数据,无需逐个在门户手动查询,具体操作如下:
前置要求
- 操作账号具备订阅级
Microsoft.ChangeAnalysis/resourceChanges/read权限和虚拟机读取权限 - PowerShell环境需提前安装
Az.ChangeAnalysis模块,CLI环境需提前安装change-analysis扩展
方案1:Azure PowerShell实现
步骤1:安装依赖并登录
Install-Module -Name Az.ChangeAnalysis -Force -AllowClobber Connect-AzAccount -Subscription "<替换为你的订阅ID>"
步骤2:批量导出历史标签到CSV
# 自定义标签变更的时间范围,示例为过去24小时,可根据实际修改 $startTime = (Get-Date).AddDays(-1).ToUniversalTime() $endTime = (Get-Date).ToUniversalTime() $outputCsv = "./VM历史标签记录.csv" $allVMs = Get-AzVM $exportResults = @() foreach ($vm in $allVMs) { # 查询指定时间范围内该VM的所有变更记录 $changeRecords = Get-AzChangeAnalysisResourceChange -ResourceId $vm.Id -StartTime $startTime -EndTime $endTime # 筛选标签类变更 $tagRelatedChanges = $changeRecords | Where-Object { $_.PropertyChanges.ChangeCategory -eq "Tag" } foreach ($change in $tagRelatedChanges) { foreach ($prop in $change.PropertyChanges) { $exportResults += [PSCustomObject]@{ 虚拟机名称 = $vm.Name 资源ID = $vm.Id 变更时间 = $change.BeforeSnapshot.Timestamp 标签键 = $prop.ProfilePropertyName 标签旧值 = $prop.OldValue 标签新值 = $prop.NewValue } } } } # 导出到CSV文件 $exportResults | Export-Csv -Path $outputCsv -NoTypeInformation -Encoding UTF8
方案2:Azure CLI实现(适用于Bash/WSL环境)
步骤1:安装扩展并登录
az extension add --name change-analysis az login --subscription "<替换为你的订阅ID>"
步骤2:批量导出历史标签到CSV
# 自定义时间范围,示例为过去24小时,UTC格式 startTime=$(date -u -d "-1 day" +"%Y-%m-%dT%H:%M:%SZ") endTime=$(date -u +"%Y-%m-%dT%H:%M:%SZ") outputCsv="./VM历史标签记录.csv" # 写入CSV表头 echo "虚拟机名称,资源ID,变更时间,标签键,标签旧值,标签新值" > $outputCsv # 遍历订阅下所有虚拟机 az vm list --query "[].{id:id, name:name}" -o tsv | while read -r vmId vmName; do # 查询标签变更记录 az change-analysis resource list --resource-id $vmId --start-time $startTime --end-time $endTime -o json \ | jq -c '.[] | select(.propertyChanges[]?.changeCategory == "Tag")' | while read -r change; do changeTime=$(echo $change | jq -r '.beforeSnapshot.timestamp') echo $change | jq -c '.propertyChanges[] | select(.changeCategory == "Tag")' | while read -r tagChange; do tagKey=$(echo $tagChange | jq -r '.profilePropertyName') oldVal=$(echo $tagChange | jq -r '.oldValue') newVal=$(echo $tagChange | jq -r '.newValue') echo "\"$vmName\",\"$vmId\",\"$changeTime\",\"$tagKey\",\"$oldVal\",\"$newVal\"" >> $outputCsv done done done
批量恢复旧标签参考脚本
导出CSV后可以直接用以下PowerShell脚本批量还原所有VM的旧标签:
$tagRecords = Import-Csv -Path "./VM历史标签记录.csv" # 按资源ID分组,整理每台VM的所有旧标签 $vmTagGroups = $tagRecords | Group-Object -Property 资源ID foreach ($vmGroup in $vmTagGroups) { $oldTagMap = @{} foreach ($tag in $vmGroup.Group) { $oldTagMap[$tag.标签键] = $tag.标签旧值 } # 覆盖现有标签为旧标签 Update-AzTag -ResourceId $vmGroup.Name -Tag $oldTagMap -Operation Replace | Out-Null Write-Host "已恢复虚拟机 $($vmGroup.Group[0].虚拟机名称) 的旧标签" }
内容的提问来源于stack exchange,提问作者user1197981
相关产品推荐
相关产品推荐

