如何在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
相关产品推荐
相关产品推荐

