Terragrunt未生成backend.tf与provider.tf,需从根目录执行init吗?
问题描述
目录结构:
├── terragrunt.hcl ├── test_include │ ├── first_level │ │ └── terragrunt.hcl │ └── terragrunt.hcl
进入test_include/first_level目录执行terragrunt init或plan时,未生成backend.tf或provider.tf文件,且当前使用本地backend。请问是否需要先从根目录执行terragrunt init?
根目录terragrunt.hcl内容:
remote_state { backend = "gcs" generate = { path = "backend.tf" if_exists = "overwrite_terragrunt" } config = { project = "google-project-1" location = "northamerica-northeast1" bucket = "tfstate-123" prefix = "include_demo/${path_relative_to_include()}/terraform.tfstate" gcs_bucket_labels = { owner = "terragrunt_state" name = "terraform_state_storage" } } } generate "provider" { path = "provider.tf" if_exists = "overwrite_terragrunt" contents = <<EOF provider "google" { region = "northamerica-northeast1" # version = "5.32.0" } EOF }
test_include/terragrunt.hcl内容:
inputs = { account = "account" }
test_include/first_level/terragrunt.hcl内容:
include "root" { path = find_in_parent_folders() expose = true } terraform { source = "../../module/" } inputs = { env = "env" name = "gaurang" }
解答
不需要先从根目录执行terragrunt init,问题出在find_in_parent_folders()的查找逻辑上:
当你在test_include/first_level目录执行Terragrunt命令时,find_in_parent_folders()会优先找到test_include目录下的terragrunt.hcl,而非根目录的配置文件。而这个目录的配置里没有定义remote_state和generate块,因此不会生成backend.tf和provider.tf,只能使用默认的本地backend。
可以通过两种方法解决:
- 方法一:直接指定根目录配置路径,修改
test_include/first_level/terragrunt.hcl的include块:include "root" { path = "${get_terragrunt_dir()}/../../terragrunt.hcl" expose = true } - 方法二:让test_include层继承根目录配置,修改
test_include/terragrunt.hcl:include "root" { path = find_in_parent_folders() expose = true } inputs = { account = "account" }
修改后,在test_include/first_level目录执行terragrunt init,就能正确继承根目录的remote_state和generate配置,生成对应的backend.tf和provider.tf文件,并使用GCS作为远程backend。
内容的提问来源于stack exchange,提问作者Gaurang Shah
相关产品推荐
相关产品推荐

