如何用单条PowerShell命令在Classic和ARM虚拟机上安装扩展
适配ARM与Classic虚拟机的OMS扩展安装脚本修改方案
首先得明确:ARM和Classic虚拟机的资源模型完全不同,对应的PowerShell命令也不一样,所以脚本需要分别处理这两类虚拟机。下面是修改后的完整脚本,同时包含错误处理,能适配仅ARM、仅Classic、混合这三种场景:
前提准备
- 确保已安装最新的Az模块(如果需要处理Classic,还要安装Az.ClassicCompute模块):
Install-Module -Name Az -AllowClobber -Force Install-Module -Name Az.ClassicCompute -AllowClobber -Force - 登录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
相关产品推荐
相关产品推荐

