Terragrunt组合模块场景下本地模块替换及--terragrunt-source变量丢失问题咨询
Terragrunt本地模块迭代开发最优方案
问题根因说明
你之前使用--terragrunt-source参数出现变量丢失,是因为该参数作用为直接替换当前Terragrunt配置对应的顶层模块源:当你指定Component模块的本地路径时,原有顶层Root模块的变量传递、标签加载逻辑会被完全跳过,自然会出现参数缺失的问题,该参数仅适用于替换当前层级的根模块源,不支持嵌套子模块的直接替换。
推荐落地方案
方案1:环境变量动态切换源(零侵入、无提交风险)
无需修改原有业务配置,仅对模块定义做少量兼容调整即可实现一键切换本地/远程源:
- 调整Root模块内的Component模块引用:
- 在Root模块的
variables.tf中新增源地址变量
variable "ecs_fargate_module_source" { type = string description = "tfm_10k_ecs_fargate模块的源地址" default = "git::ssh://git@私有仓库地址/tfm_10k_ecs_fargate.git?ref=稳定版本号" }- 把Root模块中Component实例化的source字段替换为该变量
module "ecs_fargate" { source = var.ecs_fargate_module_source # 原有标签、参数等配置全部保留 } - 在Root模块的
- 调整Terragrunt配置的source为动态取值
在对应环境的terragrunt.hcl中新增本地变量,通过环境变量读取自定义源:locals { # 未指定环境变量时默认走私有仓库源 root_app_source = get_env("TG_ROOT_APP_SOURCE", "git::ssh://git@私有仓库地址/tfm_10k_app.git?ref=稳定版本号") ecs_fargate_source = get_env("TG_ECS_FARGATE_SOURCE", "git::ssh://git@私有仓库地址/tfm_10k_ecs_fargate.git?ref=稳定版本号") } terraform { source = local.root_app_source } inputs = { ecs_fargate_module_source = local.ecs_fargate_source # 原有其他inputs全部保留 } - 本地测试时临时指定环境变量即可,无需修改任何配置文件:
终端会话关闭后环境变量自动失效,完全不存在误提交风险。# 仅测试Root模块本地修改 export TG_ROOT_APP_SOURCE=/本地绝对路径/tfm_10k_app # 仅测试Component模块本地修改 export TG_ECS_FARGATE_SOURCE=/本地绝对路径/tfm_10k_ecs_fargate # 正常执行terragrunt命令即可,变量传递逻辑完全保留 terragrunt plan
方案2:Override文件临时覆盖(无需修改现有模块代码)
如果不想调整现有模块的定义,可以用Terragrunt原生的override功能实现临时替换:
- 先在团队统一的
.gitignore中添加规则,避免临时文件被提交:terragrunt.override.hcl - 本地需要调试时,在执行命令的目录下新建
terragrunt.override.hcl,写入要覆盖的配置:terraform { source = "/本地绝对路径/tfm_10k_app" } inputs = { ecs_fargate_module_source = "/本地绝对路径/tfm_10k_ecs_fargate" # 其他要临时修改的参数也可以加在这里 } - 直接执行terragrunt命令即可,配置会自动合并,调试完成后删除该override文件即可。
最佳实践建议
- 所有嵌套模块的源地址都通过变量暴露给上层调用方,不要硬编码在模块内部,方便灵活切换源地址
- 本地调试的临时配置优先用环境变量、override文件实现,不要修改已提交的业务配置
- 团队统一本地调试的规范,避免不同工程师用不同的修改方式导致误提交
内容的提问来源于stack exchange,提问作者Skylar Graika
相关产品推荐
相关产品推荐

