Terragrunt仅支持单层级include?多层级配置报错求助
问题背景
目录结构
├── live │ └── env │ ├── dev │ │ └── terragrunt.hcl │ ├── qa │ └── terragrunt.hcl └── terragrunt.hcl
各层级Terragrunt配置
live/terragrunt.hcl
inputs = { account = "root" }
live/env/terragrunt.hcl
include { path = find_in_parent_folders() } inputs = { env = "dev" }
live/env/dev/terragrunt.hcl
include { path = find_in_parent_folders() } terraform { source = "../../../module/" } inputs = { name = "gaurang" }
报错信息
ERRO[0000] /test_terragrunt/live/env/dev/terragrunt.hcl includes
/test_terragrunt/live/env/terragrunt.hcl, which itself includes
/test_terragrunt/live/env/terragrunt.hcl. Only one level of includes
is allowed.ERRO[0000] Unable to determine underlying exit code, so
Terragrunt will exit with error code 1
疑问
移除live/env目录下的include配置后,无法合并父目录(live/terragrunt.hcl)的inputs。请问Terragrunt是否存在仅支持单层级include的限制?该如何解决此问题?
解答
Terragrunt没有严格的单层级include限制,报错是因为find_in_parent_folders()的默认行为导致了循环引用:
当live/env/terragrunt.hcl调用find_in_parent_folders()时,它会从当前目录(live/env)向上查找,默认匹配第一个找到的terragrunt.hcl——也就是它自己(当前目录下存在同名文件),而非上层的live/terragrunt.hcl,从而造成自引用循环。
解决方法
修改find_in_parent_folders()的调用参数,明确指定要查找的父级配置文件,避免自引用:
1. 修改live/env/terragrunt.hcl
将include块改为从父目录开始查找,跳过当前目录的配置文件:
include { # skip=1 表示跳过当前目录的terragrunt.hcl,从父目录开始查找 path = find_in_parent_folders("terragrunt.hcl", skip = 1) } inputs = { env = "dev" }
或者直接明确指定父级文件的相对路径:
include { path = "../terragrunt.hcl" } inputs = { env = "dev" }
2. 保留live/env/dev/terragrunt.hcl的原有配置
它的find_in_parent_folders()会正确找到live/env/terragrunt.hcl,而后者已经正确引用了live/terragrunt.hcl,最终实现三层inputs的自动合并:
account = "root"(来自live/terragrunt.hcl)env = "dev"(来自live/env/terragrunt.hcl)name = "gaurang"(来自live/env/dev/terragrunt.hcl)
补充说明
find_in_parent_folders()的skip参数用于指定跳过当前目录开始的前N个同名文件,当当前目录存在配置文件时,设置skip=1可有效避免自引用。- Terragrunt支持多层级include嵌套,只要每个include指向正确的父级配置、不形成循环即可,所有层级的
inputs会自动合并生效。
内容的提问来源于stack exchange,提问作者Gaurang Shah

