Azure自动化PowerShell Runbook获取VM详情并导出Blob问题求助
Azure自动化Runbook脚本修复:VM详情导出至Blob存储
原脚本核心问题
- Az模块与AzureRM模块混用,导致Blob上传失败
- VM与网卡的匹配逻辑效率低下且易出错
- 公网IP匹配逻辑错误(未遍历网卡的IP配置集合)
- 应用安全组ID未做格式化处理,导出后显示异常
- 临时文件路径未指定自动化沙盒的合法路径
- 缺乏错误捕获机制,无法快速定位问题
修复后的完整脚本
# 确保使用Az模块,避免与AzureRM冲突 Connect-AzAccount -Identity $subscriptionId = "mySubID" $reportName = "myReport.csv" $storageAccountName = "storagename" $storageAccountKey = "storagekey" $containerName = "conttainername" # 使用自动化沙盒的临时目录存储CSV,避免路径权限问题 $tempCsvPath = Join-Path -Path $env:TEMP -ChildPath "AutomationFile123.csv" # 切换目标订阅 Select-AzSubscription -SubscriptionId $subscriptionId # 预加载资源并创建哈希表,优化后续匹配效率 $vms = Get-AzVM $vmHash = @{} foreach ($vm in $vms) { $vmHash[$vm.Id] = $vm } $publicIps = Get-AzPublicIpAddress $publicIpHash = @{} foreach ($ip in $publicIps) { if ($ip.IpConfiguration.Id) { $publicIpHash[$ip.IpConfiguration.Id] = $ip.IpAddress } } $nics = Get-AzNetworkInterface | Where-Object { $_.VirtualMachine -ne $null } $report = @() foreach ($nic in $nics) { # 通过哈希表快速匹配关联VM $vm = $vmHash[$nic.VirtualMachine.Id] if (-not $vm) { Write-Warning "未找到与网卡 $($nic.Name) 关联的VM" continue } # 用PSCustomObject创建结构化数据,比Select更高效 $info = [PSCustomObject]@{ VmName = $vm.Name ResourceGroupName = $vm.ResourceGroupName Region = $vm.Location VmSize = $vm.HardwareProfile.VmSize VirtualNetwork = $nic.IpConfigurations.Subnet.Id.Split("/")[-3] Subnet = $nic.IpConfigurations.Subnet.Id.Split("/")[-1] PrivateIpAddress = $nic.IpConfigurations.PrivateIpAddress -join ", " OsType = $vm.StorageProfile.OsDisk.OsType PublicIPAddress = "" NicName = $nic.Name ApplicationSecurityGroup = $nic.IpConfigurations.ApplicationSecurityGroups.Id -join ", " } # 遍历网卡所有IP配置,匹配对应公网IP foreach ($ipConfig in $nic.IpConfigurations) { if ($publicIpHash.ContainsKey($ipConfig.Id)) { $info.PublicIPAddress += $publicIpHash[$ipConfig.Id] + ", " } } # 清理末尾多余的逗号 $info.PublicIPAddress = $info.PublicIPAddress.TrimEnd(", ") $report += $info } # 输出预览并导出CSV(指定UTF8编码避免乱码) $report | Format-Table VmName, ResourceGroupName, Region, VmSize, VirtualNetwork, Subnet, PrivateIpAddress, OsType, PublicIPAddress, NicName, ApplicationSecurityGroup $report | Export-Csv -Path $tempCsvPath -NoTypeInformation -Encoding UTF8 # 使用Az模块上传Blob,替换原AzureRM命令 $storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey Set-AzStorageBlobContent -Context $storageContext -Container $containerName -File $tempCsvPath -Blob "AutomationFile123.csv" -Force # 清理临时文件 Remove-Item -Path $tempCsvPath -Force
关键修复说明
- 统一Az模块:替换AzureRM模块的Blob操作命令,避免模块版本冲突导致上传失败
- 哈希表优化匹配:将VM和公网IP的匹配逻辑从遍历改为哈希表查找,大幅提升效率并避免匹配错误
- 修正公网IP匹配:遍历网卡的每个IP配置,确保正确关联对应的公网IP
- 格式化数组字段:将多IP地址、多应用安全组ID用逗号拼接为字符串,避免CSV导出后显示异常
- 合法临时路径:使用自动化沙盒的
$env:TEMP目录存储CSV,解决路径权限问题 - 新增错误提示:添加未找到关联VM的警告日志,便于排查资源关联问题
- 优化对象创建:使用
PSCustomObject替代"" | Select,提升数据结构的稳定性和效率
内容的提问来源于stack exchange,提问作者Nares
相关产品推荐
相关产品推荐

