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

Azure VMSS中Custom Script扩展无法执行问题求助

问题分析与解决方案

核心问题排查

  1. CustomScript扩展无输出的直接原因

    • 你执行的dir C:\\ > C:\\temp\\test.txt依赖C:\temp目录存在,但系统账户默认不会自动创建该目录,导致命令执行失败无输出。
    • 可在VM实例的C:\Packages\Plugins\Microsoft.Azure.Extensions.CustomScript\2.0\Logs路径下查看扩展执行日志,获取具体报错信息。
  2. CustomData在Windows VMSS中的处理误区
    Windows系统下,Terraform传递的customData会被自动Base64编码后存储为C:\AzureData\CustomData.bin,直接改名成ps1脚本会导致内容乱码,无法正常执行。

修正步骤与代码调整

1. 修复基础命令执行

先确保测试命令能正常输出,修改commandToExecute为:

powershell -Command "New-Item -Path C:\temp -ItemType Directory -Force; dir C:\ > C:\temp\test.txt"

这段命令会先创建temp目录,再执行dir输出,避免因目录不存在导致失败。

2. 正确解码并执行代理安装脚本

替换CustomScript扩展的settings部分,加入Base64解码逻辑:

settings = jsonencode({
  "commandToExecute" = <<EOF
powershell -ExecutionPolicy Unrestricted -Command "
# 解码CustomData.bin为可执行脚本
\$scriptContent = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String((Get-Content -Path C:\\AzureData\\CustomData.bin -Raw)))
\$scriptContent | Out-File -Path C:\\AzureData\\install_agent.ps1 -Encoding UTF8

# 执行代理安装脚本并记录日志
& C:\\AzureData\\install_agent.ps1 | Out-File -Path C:\\temp\\agent_install_log.txt -Encoding UTF8
"
EOF
})

3. 确保Azure DevOps代理注册的前置条件

  • NSG出站规则:添加允许VMSS实例访问dev.azure.com:443的出站规则,确保能连接到Azure DevOps服务。
  • PAT令牌权限:确认你的PAT令牌拥有Agent Pools (Read & Manage)权限,否则无法完成代理注册。
  • 无交互安装:在agent_install_script.ps1中使用config.cmd --unattended等无交互参数执行代理配置,避免因等待输入导致脚本挂起。

4. 扩展执行可靠性优化

  • 将超时时间延长至2小时,确保代理安装有足够时间完成。
  • 若有其他前置扩展,添加provision_after_extensions确保执行顺序正确。

完整修正后的扩展代码示例

resource "azurerm_virtual_machine_scale_set_extension" "ext" {
  name                         = "InstallDevOpsAgent"
  virtual_machine_scale_set_id = module.vmss_windows2022g2.id
  publisher                    = "Microsoft.Azure.Extensions"
  type                         = "CustomScript"
  type_handler_version         = "2.0"

  settings = jsonencode({
    "commandToExecute" = <<EOF
powershell -ExecutionPolicy Unrestricted -Command "
New-Item -Path C:\\temp -ItemType Directory -Force;
\$scriptContent = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String((Get-Content -Path C:\\AzureData\\CustomData.bin -Raw)))
\$scriptContent | Out-File -Path C:\\AzureData\\install_agent.ps1 -Encoding UTF8;
& C:\\AzureData\\install_agent.ps1 | Out-File -Path C:\\temp\\agent_install_log.txt -Encoding UTF8
"
EOF
  })

  failure_suppression_enabled = false
  auto_upgrade_minor_version  = false
  automatic_upgrade_enabled   = false

  timeouts {
    create = "2h"
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:50:33