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

如何用单条PowerShell命令在Classic和ARM虚拟机上安装扩展

适配ARM与Classic虚拟机的OMS扩展安装脚本修改方案

首先得明确:ARM和Classic虚拟机的资源模型完全不同,对应的PowerShell命令也不一样,所以脚本需要分别处理这两类虚拟机。下面是修改后的完整脚本,同时包含错误处理,能适配仅ARM、仅Classic、混合这三种场景:

前提准备

  1. 确保已安装最新的Az模块(如果需要处理Classic,还要安装Az.ClassicCompute模块):
    Install-Module -Name Az -AllowClobber -Force
    Install-Module -Name Az.ClassicCompute -AllowClobber -Force
    
  2. 登录Azure账号并选择目标订阅:
    Connect-AzAccount
    Select-AzSubscription -SubscriptionName "<你的目标订阅名称>"
    

完整修改后的脚本

# 配置OMS工作区信息(请替换为你自己的ID和密钥)
$omsWorkspaceId = "你的OMS工作区ID"
$omsWorkspaceKey = "你的OMS工作区密钥"

# -------------------------- 处理ARM虚拟机 --------------------------
Write-Host "`n===== 开始处理ARM虚拟机 =====" -ForegroundColor Cyan
try {
    # 获取当前订阅下所有运行中的ARM虚拟机(可根据需求去掉状态过滤)
    $armVms = Get-AzVM | Where-Object { $_.PowerState -eq "VM running" }
    
    if ($armVms.Count -eq 0) {
        Write-Host "未找到运行中的ARM虚拟机" -ForegroundColor Yellow
    } else {
        foreach ($vm in $armVms) {
            try {
                Write-Host "正在为ARM虚拟机 [$($vm.Name)] 安装OMS扩展..."
                Set-AzVMExtension -ResourceGroupName $vm.ResourceGroupName `
                    -VMName $vm.Name `
                    -Name "MicrosoftMonitoringAgent" `
                    -Publisher "Microsoft.EnterpriseCloud.Monitoring" `
                    -ExtensionType "MicrosoftMonitoringAgent" `
                    -TypeHandlerVersion "1.0" `
                    -SettingString (@{"workspaceId" = $omsWorkspaceId} | ConvertTo-Json) `
                    -ProtectedSettingString (@{"workspaceKey" = $omsWorkspaceKey} | ConvertTo-Json) `
                    -Location $vm.Location `
                    -Force
                Write-Host "ARM虚拟机 [$($vm.Name)] 扩展安装成功!" -ForegroundColor Green
            } catch {
                Write-Host "ARM虚拟机 [$($vm.Name)] 扩展安装失败:$($_.Exception.Message)" -ForegroundColor Red
            }
        }
    }
} catch {
    Write-Host "处理ARM虚拟机时发生全局错误:$($_.Exception.Message)" -ForegroundColor Red
}

# -------------------------- 处理Classic虚拟机 --------------------------
Write-Host "`n===== 开始处理Classic虚拟机 =====" -ForegroundColor Cyan
try {
    # 注册Classic Compute资源提供者(首次运行需要,重复运行不影响)
    Register-AzResourceProvider -ProviderNamespace Microsoft.ClassicCompute | Out-Null
    
    # 获取当前订阅下所有运行中的Classic虚拟机(可根据需求去掉状态过滤)
    $classicVms = Get-AzResource -ResourceType Microsoft.ClassicCompute/virtualMachines | 
                  Where-Object { $_.Properties.statuses[0].code -eq "PowerState/running" }
    
    if ($classicVms.Count -eq 0) {
        Write-Host "未找到运行中的Classic虚拟机" -ForegroundColor Yellow
    } else {
        # 切换到Classic服务管理模式
        Switch-AzMode -Name AzureServiceManagement | Out-Null
        
        foreach ($vm in $classicVms) {
            try {
                Write-Host "正在为Classic虚拟机 [$($vm.Name)] 安装OMS扩展..."
                Set-AzureVMExtension -VMName $vm.Name `
                    -Name "MicrosoftMonitoringAgent" `
                    -Publisher "Microsoft.EnterpriseCloud.Monitoring" `
                    -ExtensionType "MicrosoftMonitoringAgent" `
                    -Version "1.0" `
                    -PublicConfiguration (@{"workspaceId" = $omsWorkspaceId} | ConvertTo-Json) `
                    -PrivateConfiguration (@{"workspaceKey" = $omsWorkspaceKey} | ConvertTo-Json) `
                    -Location $vm.Location `
                    -Force
                Write-Host "Classic虚拟机 [$($vm.Name)] 扩展安装成功!" -ForegroundColor Green
            } catch {
                Write-Host "Classic虚拟机 [$($vm.Name)] 扩展安装失败:$($_.Exception.Message)" -ForegroundColor Red
            }
        }
        
        # 切换回ARM资源管理模式
        Switch-AzMode -Name AzureResourceManager | Out-Null
    }
} catch {
    Write-Host "处理Classic虚拟机时发生全局错误:$($_.Exception.Message)" -ForegroundColor Red
}

Write-Host "`n===== 所有虚拟机处理完成 =====" -ForegroundColor Cyan

关键修改点说明

  • 分类型处理:明确拆分ARM和Classic虚拟机的逻辑,各自使用对应模块的命令(ARM用Get-AzVM/Set-AzVMExtension,Classic用Get-AzResource/Set-AzureVMExtension)
  • 状态过滤:默认只处理运行中的虚拟机,避免给关机VM安装扩展导致失败(如果需要处理所有VM,去掉Where-Object过滤即可)
  • 错误处理:全局和单VM层面都加了try-catch,单个VM安装失败不会中断整个脚本的执行
  • 模式切换:处理Classic时切换到Azure Service Management模式,完成后切回ARM模式,避免影响后续操作
  • 配置格式化:把配置参数转成JSON格式,避免格式错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:06:37