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

Azure自动化Runbook执行Start/Stop-AzVM异常求助

问题:Azure自动化Runbook调度执行时部分VM未完成启停操作

我在一个资源组下有一组虚拟机,创建了PowerShell Workflow类型、运行时版本5.1的自动化Runbook,用来按调度启停VM。Runbook通过标签筛选目标VM,参数包括TagName、TagValue和PowerStat(True启动,False停止)。所有VM的标签配置都确认正确,测试面板中运行代码一切正常,但调度执行时会随机有1-3台VM未完成启停操作,无固定规律,且没有错误日志。

原Runbook代码:

workflow VM-On-Off-ScheduleCode
{
    Param(
    [Parameter(Mandatory=$true)]
    [String]
    $TagName,
    [Parameter(Mandatory=$true)]
    [String]
    $TagValue,
    [Parameter(Mandatory=$true)]
    [Boolean]
    $PowerStat
    )

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# Set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext 

$vms = Get-AzResource -ResourceType Microsoft.Compute/virtualMachines -TagName $TagName -TagValue $TagValue

Foreach -Parallel ($vm in $vms){
        if($PowerStat){
            Start-AzVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName;
            Write-Output "Starting $($vm.Name)";
        }
        else{
            Stop-AzVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force;
            Write-Output "Stopping $($vm.Name)";
        }
    }
}

可能的原因分析

  1. 并行块上下文丢失:PowerShell Workflow的ForEach -Parallel会在独立会话中执行,原代码的AzContext没有正确传递到并行线程,导致部分VM操作因权限/上下文问题失败,但未生成可见日志。
  2. 通用资源对象的局限性:用Get-AzResource获取的是通用资源对象,而非专门的VM对象,可能导致Start-AzVM/Stop-AzVM调用时出现隐性参数错误。
  3. 无错误处理与重试:VM启停可能因Azure临时网络波动、资源锁等失败,原代码没有捕获错误或重试,导致失败无记录。
  4. 并行限流:Azure自动化账户对并行作业有默认限制,过多并行操作会被静默限流。

解决方案

修改后的Runbook代码

workflow VM-On-Off-ScheduleCode
{
    Param(
        [Parameter(Mandatory=$true)]
        [String]
        $TagName,
        [Parameter(Mandatory=$true)]
        [String]
        $TagValue,
        [Parameter(Mandatory=$true)]
        [Boolean]
        $PowerStat
    )

    # 禁止继承上下文,避免干扰
    Disable-AzContextAutosave -Scope Process

    # 连接Azure并初始化上下文
    $AzureContext = (Connect-AzAccount -Identity).context
    $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext 

    # 用Get-AzVM直接获取VM专用对象,确保参数准确
    $vms = Get-AzVM -TagName $TagName -TagValue $TagValue

    # 限制并行数(可根据VM数量调整,建议10以内),避免触发限流
    Foreach -Parallel -ThrottleLimit 10 ($vm in $vms){
        # 在并行块内重新设置上下文,确保会话独立可用
        $localContext = Set-AzContext -SubscriptionId $vm.Id.Split('/')[2] -DefaultProfile $Using:AzureContext

        $retryCount = 3
        $operationSuccess = $false

        # 重试机制,处理临时故障
        while ($retryCount -gt 0 -and !$operationSuccess) {
            Try {
                if($PowerStat){
                    Start-AzVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -DefaultProfile $localContext -ErrorAction Stop
                    Write-Output "[$(Get-Date)] 成功启动VM: $($vm.Name)"
                }
                else{
                    Stop-AzVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force -DefaultProfile $localContext -ErrorAction Stop
                    Write-Output "[$(Get-Date)] 成功停止VM: $($vm.Name)"
                }
                $operationSuccess = $true
            }
            Catch {
                $retryCount--
                Write-Output "[$(Get-Date)] VM $($vm.Name)操作失败,剩余重试次数: $retryCount,错误详情: $($_.Exception.Message)"
                Start-Sleep -Seconds 10
            }
        }

        # 记录最终失败的VM
        if (!$operationSuccess) {
            Write-Error "[$(Get-Date)] 经过3次重试后,VM $($vm.Name)操作仍未成功"
        }
    }
}

额外排查与优化建议

  • 开启详细日志:在自动化账户的Runbook设置中启用“详细日志记录”,可以查看并行块内的每一步输出,便于定位问题。
  • 验证身份权限:确认自动化账户的系统分配身份拥有Microsoft.Compute/virtualMachines/start/action和Microsoft.Compute/virtualMachines/deallocate/action权限,且权限覆盖所有目标VM所在的资源组。
  • 检查VM状态:查看未执行的VM是否存在资源锁、磁盘故障或其他阻止启停的状态。

内容的提问来源于stack exchange,提问作者Arunava Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:52:54