使用Azure Automation运行Pre/Post patching脚本并获取VM内执行输出咨询
实现方案及问题修复
核心问题说明
- 现有脚本未捕获
Invoke-AzVMRunCommand的返回结果,该命令的执行输出、错误日志全部存储在返回对象的Value属性中,没有对结果做打印处理的话,Automation作业日志自然不会展示执行输出 - 现有脚本只支持单VM硬编码执行,未适配多VM批量调度逻辑
- 注意先确认你的Azure Automation账户已安装最新的
Az.Accounts、Az.Compute模块,完全卸载所有AzureRM相关模块避免cmdlet冲突
适配多VM批量执行+输出捕获的脚本
# 连接Azure $ServicePrincipalConnection = Get-AutomationConnection -Name 'AzureRunAsConnection' Connect-AzAccount -ServicePrincipal ` -TenantId $ServicePrincipalConnection.TenantId ` -ApplicationId $ServicePrincipalConnection.ApplicationId ` -CertificateThumbprint $ServicePrincipalConnection.CertificateThumbprint | Out-Null # 配置参数:可以按需求调整为按标签/资源组批量获取VM $targetResourceGroup = "raimundas-rg" # 示例:获取指定资源组下所有Windows VM,也可以手动指定VM列表 $vmList = @("test-win-vm1","test-win-vm2") $vmList = Get-AzVM -ResourceGroupName $targetResourceGroup | Where-Object { $_.StorageProfile.OsDisk.OsType -eq "Windows" } | Select-Object -ExpandProperty Name # 要执行的内部脚本 $ScriptToRun = @" Get-Service "wuauserv" | Select-Object Name, Status, StartType | ConvertTo-Json "@ Out-File -InputObject $ScriptToRun -FilePath ScriptToRun.ps1 -Force # 批量遍历VM执行 foreach ($vmName in $vmList) { Write-Output "---------- 开始处理VM: $vmName ----------" try { # 捕获执行结果 $runResult = Invoke-AzVMRunCommand -ResourceGroupName $targetResourceGroup ` -Name $vmName ` -CommandId 'RunPowerShellScript' ` -ScriptPath ScriptToRun.ps1 ` -ErrorAction Stop # 提取标准输出和错误输出 $stdOutput = $runResult.Value[0].Message $stdError = $runResult.Value[1].Message Write-Output "执行成功,标准输出:" Write-Output $stdOutput if ($stdError) { Write-Warning "执行警告/错误输出:" Write-Warning $stdError } } catch { Write-Error "VM $vmName 执行失败,错误信息:$_" } Write-Output "---------- 结束处理VM: $vmName ----------`n" } # 清理临时文件 Remove-Item -Path ScriptToRun.ps1 -Force -ErrorAction SilentlyContinue
输出查看说明
运行完成后,在Azure Automation的作业日志中,输出面板会展示每台VM的执行结果,警告面板会展示脚本在VM内部执行的错误信息,错误面板会展示命令调用层面的失败信息(比如权限不足、VM未开机等)
内容的提问来源于stack exchange,提问作者Raimyzzz
相关产品推荐
相关产品推荐

