Invoke-AzVMRunCommand超时处理需求:设30分钟超时并分类导出服务器信息
解决Invoke-AzVMRunCommand超时及结果分类导出问题
核心实现方案
1. 设置命令超时
Invoke-AzVMRunCommand原生支持-TimeoutInSeconds参数,直接设置为1800秒(30分钟)即可,超时后Azure会自动终止命令执行。
2. 捕获超时异常并分类记录
遍历服务器列表时,通过try/catch块捕获执行异常,判断是否为超时场景,分别维护成功和超时的服务器信息集合。
3. 分类导出CSV
将两个集合分别导出为独立CSV文件,方便后续查看和批量处理。
PowerShell脚本示例(GitHub Actions中使用)
# 初始化结果集合 $successfulServers = @() $timedOutServers = @() # 获取目标服务器列表(可根据实际需求添加过滤条件) $vmList = Get-AzVM -ResourceGroupName "your-resource-group-name" foreach ($vm in $vmList) { # 初始化单台服务器信息对象 $serverRecord = [PSCustomObject]@{ VMName = $vm.Name ResourceGroupName = $vm.ResourceGroupName OSType = $vm.StorageProfile.OsDisk.OsType ExecutionStatus = "" CompletionTime = Get-Date } try { # 根据操作系统选择对应的命令ID $commandId = if ($vm.StorageProfile.OsDisk.OsType -eq "Windows") { "RunPowerShellScript" } else { "RunShellScript" } # 执行命令并设置30分钟超时 $null = Invoke-AzVMRunCommand -ResourceGroupName $vm.ResourceGroupName ` -VMName $vm.Name ` -CommandId $commandId ` -ScriptPath "./path-to-your-script.ps1" ` # Windows用.ps1,Linux用.sh -TimeoutInSeconds 1800 ` -ErrorAction Stop $serverRecord.ExecutionStatus = "Completed" $successfulServers += $serverRecord Write-Host "[$($vm.Name)] 执行完成" } catch { # 匹配超时相关错误信息,判断是否为超时终止 if ($_.Exception.Message -match "超时|Timeout") { $serverRecord.ExecutionStatus = "TimedOut" $timedOutServers += $serverRecord Write-Host "[$($vm.Name)] 执行超时,已终止" } else { # 其他错误可按需单独记录或忽略 Write-Warning "[$($vm.Name)] 执行失败:$($_.Exception.Message)" } } } # 导出结果到CSV文件 $successfulServers | Export-Csv -Path "./successful-servers.csv" -NoTypeInformation -Encoding UTF8 $timedOutServers | Export-Csv -Path "./timed-out-servers.csv" -NoTypeInformation -Encoding UTF8 Write-Host "结果导出完成:成功$($successfulServers.Count)台,超时$($timedOutServers.Count)台"
GitHub Actions流水线配置示例
jobs: execute-vm-commands: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: Azure登录 uses: azure/login@v2 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: 在VM上执行命令并导出结果 uses: azure/powershell@v1 with: inlineScript: | # 粘贴上面的PowerShell脚本内容 azPSVersion: "latest" - name: 上传成功服务器列表 uses: actions/upload-artifact@v4 with: name: successful-servers path: ./successful-servers.csv - name: 上传超时服务器列表 uses: actions/upload-artifact@v4 with: name: timed-out-servers path: ./timed-out-servers.csv
注意事项
- 确保Azure凭据拥有Virtual Machine Contributor及以上权限,能正常执行Invoke-AzVMRunCommand操作
- Linux服务器需将脚本路径改为Bash脚本(.sh),命令ID固定为
RunShellScript - Azure对Invoke-AzVMRunCommand的超时上限为1800秒(30分钟),刚好匹配需求
- 异常匹配的字符串可根据实际返回的错误信息调整,确保准确捕获超时场景
内容的提问来源于stack exchange,提问作者subbareddy
相关产品推荐
相关产品推荐

