Azure VMSS中Custom Script扩展无法执行问题求助
问题分析与解决方案
核心问题排查
CustomScript扩展无输出的直接原因
- 你执行的
dir C:\\ > C:\\temp\\test.txt依赖C:\temp目录存在,但系统账户默认不会自动创建该目录,导致命令执行失败无输出。 - 可在VM实例的
C:\Packages\Plugins\Microsoft.Azure.Extensions.CustomScript\2.0\Logs路径下查看扩展执行日志,获取具体报错信息。
- 你执行的
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
相关产品推荐
相关产品推荐

