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

如何在Terragrunt中通过Terraform将.env文件转为对象列表传参

实现Terragrunt读取.env文件并生成param_list参数

步骤1:定义.env文件加载顺序

在terragrunt.hcl的locals块中,按通用到具体的顺序定义要加载的.env文件,确保后续文件的配置能覆盖前置的基准配置:

locals {
  env_name = get_env("ENV_NAME")
  env_type = trim(local.env_name, "1234567890")

  # 按优先级从低到高加载:基准→环境类型→具体环境→本地配置
  env_files = compact([
    ".env",
    local.env_type != "" ? ".env.${local.env_type}" : null,
    ".env.${local.env_name}",
    fileexists(".env.local") ? ".env.local" : null
  ])
}
  • compact函数自动移除列表中的null值,避免加载不存在的文件
  • 本地配置.env.local仅在文件存在时才加载,优先级最高

步骤2:读取并合并.env文件内容

将所有目标.env文件的内容拼接成单一字符串,方便后续统一解析:

locals {
  # ... 保留前面的locals内容 ...

  # 读取所有目标文件并合并内容
  env_content = join("\n", [for f in local.env_files : file(f)])
}

步骤3:解析内容为键值对Map

通过正则表达式分割每行的键和值,过滤空行与注释行,最终合并为一个键值对Map,自动实现后续配置覆盖前置配置:

locals {
  # ... 保留前面的locals内容 ...

  # 解析.env内容为键值对Map,自动处理覆盖逻辑
  env_map = merge([
    for line in split("\n", local.env_content) :
    (
      # 跳过空行和以#开头的注释行
      length(trimspace(line)) == 0 || startswith(trimspace(line), "#") ? {} :
      {
        # 正则分割键和值,自动去除值两端的引号
        regex("^([^=]+)=\"?(.*?)\"?$", trimspace(line))[0] : regex("^([^=]+)=\"?(.*?)\"?$", trimspace(line))[1]
      }
    )
  ]...)
}
  • merge函数将多个小Map合并为一个,重复的键会以最后出现的Map中的值为准,自然实现配置覆盖逻辑
  • 正则表达式兼容带引号和不带引号的.env值格式

步骤4:转换为模块要求的param_list格式

将键值对Map转换为Terraform模块需要的list(object)格式:

locals {
  # ... 保留前面的locals内容 ...

  # 转换为模块要求的param_list结构
  param_list = [
    for key, value in local.env_map :
    {
      name  = key
      type  = "string"
      value = value
    }
  ]
}

步骤5:传入Terraform模块

最后在inputs块中将生成的param_list传入目标模块:

terraform {
  source = "../path/to/your/terraform/module" # 替换为你的模块实际路径
}

inputs = {
  param_list = local.param_list
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:00:06