Terragrunt子文件变量传参及模块输出机制解析(附指定结构示例)
Terragrunt 变量传递与模块输出实操指南
1. 子文件中变量的获取与传递
核心实现思路
通过Terragrunt内置路径函数从文件夹名提取environment和region,结合read_terragrunt_config读取tfvars配置文件,最终通过inputs或extra_arguments将变量传递给Terraform模块。
对应目录结构的配置示例
根目录全局配置 (sandbox/terragrunt.hcl)
作为所有子模块的基础配置,定义通用规则并允许子模块继承:
terraform { extra_arguments "path_based_vars" { commands = get_terraform_commands_that_need_vars() # 从文件夹路径动态提取environment和region arguments = [ "-var", "environment=${basename(get_terragrunt_dir())}", # 提取sandbox作为environment "-var", "region=${basename(dirname(get_terragrunt_dir()))}", # 提取子模块所在区域,如eu-west-1 ] } } # 读取全局通用变量文件 inputs = merge( read_terragrunt_config(find_in_parent_folders("common.tfvars")), {} ) # 远程状态配置(建议启用,用于跨模块输出共享) remote_state { backend = "s3" config = { bucket = "my-terraform-state-${var.environment}" key = "${path_relative_to_include()}/terraform.tfstate" region = var.region encrypt = true dynamodb_table = "terraform-state-locks" } }
全局通用变量文件 (sandbox/common.tfvars)
存储跨区域共享的变量:
tags = { Environment = "sandbox" ManagedBy = "Terragrunt" } aws_account_id = "123456789012"
区域专属变量文件 (sandbox/eu-west-1/regional.tfvars)
存储当前区域的特有配置:
availability_zones = ["eu-west-1a", "eu-west-1b", "eu-west-1c"] vpc_cidr = "10.0.0.0/16"
子模块示例:VPC配置 (sandbox/eu-west-1/vpc/terragrunt.hcl)
继承根配置,合并多源变量并传递给Terraform模块:
include { path = find_in_parent_folders() # 继承根目录的全局配置 } inputs = merge( read_terragrunt_config(find_in_parent_folders("regional.tfvars")), # 读取区域变量 { # 本地自定义变量,结合路径提取的全局变量 vpc_name = "${var.environment}-${var.region}-vpc" } ) # 指定Terraform模块(可替换为自定义模块路径) terraform { source = "terraform-aws-modules/vpc/aws//modules/vpc" }
2. Terragrunt变量与模块输出的工作机制解析
变量优先级规则
Terragrunt传递给Terraform模块的变量遵循以下优先级(从高到低):
- 命令行直接传入的变量(
-var/-var-file) - Terragrunt配置中
inputs块定义的变量 - 通过
read_terragrunt_config读取的tfvars文件变量 - Terraform模块自身的默认变量
模块输出共享机制
当模块需要依赖其他模块的输出(如ECS集群依赖VPC的子网ID),Terragrunt通过dependency块实现跨模块输出引用:
示例:ECS集群依赖VPC输出 (sandbox/eu-west-1/ecs-cluster/terragrunt.hcl)
include { path = find_in_parent_folders() } # 声明依赖的VPC模块 dependency "vpc" { config_path = "../vpc" # 依赖模块的相对路径 } inputs = merge( read_terragrunt_config(find_in_parent_folders("regional.tfvars")), { cluster_name = "${var.environment}-${var.region}-ecs-cluster" # 直接引用VPC模块的输出值 vpc_id = dependency.vpc.outputs.vpc_id subnet_ids = dependency.vpc.outputs.private_subnet_ids } ) terraform { source = "terraform-aws-modules/ecs/aws//modules/cluster" }
底层工作逻辑
- 路径变量提取:Terragrunt在加载配置时执行
get_terragrunt_dir()、basename()等内置函数,动态解析文件夹名称为变量值。 - 变量合并:
merge函数按优先级合并多个变量源,后定义的变量会覆盖前序同名变量。 - 依赖解析:
dependency块会先检查依赖模块的状态文件是否存在,若未部署则提示先部署依赖模块;部署完成后,从依赖模块的Terraform状态文件中读取输出值,注入当前模块的inputs。
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

