Terraform Plan任务卡住无进展且无报错,求排查方案
Terraform Plan阶段卡住的排查方案
1. 开启Terraform原生调试日志
Azure Pipelines的System.Debug仅输出任务层面日志,要获取Terraform内部执行细节,需在执行terraform plan时添加Terraform专属环境变量:
- 在流水线任务中新增环境变量
TF_LOG=DEBUG,或直接修改执行命令为:
该配置会输出Terraform与远程状态存储的交互细节(如锁的获取流程、状态文件读取过程、云服务API请求日志),可精准定位卡住的具体环节。TF_LOG=DEBUG /usr/local/bin/terraform plan -var-file vars/devfile.tfvars
2. 检查远程状态锁的细节
虽然能观察到tfstate被锁定,但需确认锁的状态是否正常:
- 使用Azure CLI查看tfstate文件的元数据(锁信息存储在元数据中):
查看锁的持有者ID、创建时间,确认是否为当前流水线进程持有,或是存在无效的遗留锁。az storage blob show --account-name <你的存储账户名> --container-name <状态文件容器名> --name <tfstate文件路径> --query 'metadata' - 若确认无活跃进程,可手动解锁:
terraform state unlock <锁ID>
3. 排查执行环境的隐性问题
- 存储账户防火墙:检查存储账户的防火墙规则,确认流水线代理的出站IP是否在允许列表内。即使能创建tfstate,后续的锁交互、状态读取仍可能因网络限制停滞。
- Terraform版本一致性:对比稳定流水线与新流水线使用的Terraform版本,确保二者完全一致。不同版本的Terraform在远程状态锁处理逻辑上可能存在差异。
- 代理资源占用:查看执行新流水线的代理机器CPU、内存使用率,确认是否因资源耗尽导致Terraform进程无法推进。
4. 手动在代理机器复现执行
找到新流水线使用的代理机器,以服务连接对应的身份(如服务主体)手动执行以下步骤:
- 克隆代码到代理本地
- 执行
terraform init(带上与流水线一致的后端配置) - 执行
terraform plan -var-file vars/devfile.tfvars
手动执行可实时观察输出,更容易定位到卡住的具体步骤(如等待云服务API响应、隐性权限缺失)。
5. 检查任务配置细节
- 确认流水线任务的超时时间设置,避免因超时未触发导致看似“卡住”的情况。
- 逐行对比两条流水线的任务配置,除变量组和服务连接外,检查是否存在工作目录、后端配置参数、任务版本等隐性差异。
内容的提问来源于stack exchange,提问作者Saugat Mukherjee
相关产品推荐
相关产品推荐

