You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:52:50