You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块的变量遵循以下优先级(从高到低):

  1. 命令行直接传入的变量(-var/-var-file)
  2. Terragrunt配置中inputs块定义的变量
  3. 通过read_terragrunt_config读取的tfvars文件变量
  4. 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"
}

底层工作逻辑

  1. 路径变量提取:Terragrunt在加载配置时执行get_terragrunt_dir()、basename()等内置函数,动态解析文件夹名称为变量值。
  2. 变量合并:merge函数按优先级合并多个变量源,后定义的变量会覆盖前序同名变量。
  3. 依赖解析:dependency块会先检查依赖模块的状态文件是否存在,若未部署则提示先部署依赖模块;部署完成后,从依赖模块的Terraform状态文件中读取输出值,注入当前模块的inputs。

内容的提问来源于stack exchange,提问作者Francesco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:00:19