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

如何在main.tf中将Terraform子目录作为本地模块调用 含yaml/json读取

方案说明

完全可以通过本地Module的方式封装配置读取和资源创建逻辑,和你期望的调用格式完全匹配,具体实现如下:

1. 子模块目录结构与文件定义

首先在./modules/databases目录下创建以下3个文件:

  • variables.tf:声明模块输入变量
  • main.tf:存放配置读取、资源创建逻辑
  • outputs.tf(可选):对外暴露模块创建的资源属性,供根模块调用

1.1 modules/databases/variables.tf 内容

variable "environment" {
  type        = string
  description = "当前部署环境,用于过滤匹配对应环境的数据库配置"
}

1.2 modules/databases/main.tf 内容

locals {
  # 必须使用path.module定位模块目录下的配置文件,避免相对路径解析错误
  dbs = yamldecode(file("${path.module}/database.yml"))
}

resource "resourcename" "dbss" {
  for_each = {
    for db in local.dbs.databases : db.id => db
    if db.environment == var.environment
  }
  name    = each.value.name
  comment = each.value.comment
}

如果是读取JSON格式的配置,只需要将yamldecode替换为jsondecode即可,文件路径规则保持一致

1.3 modules/databases/outputs.tf 内容(可选)

如果需要在根模块中引用子模块创建的数据库资源,添加以下输出定义:

output "db_instances" {
  type = map(object({
    name    = string
    comment = string
    # 可按需补充其他需要对外暴露的资源属性
  }))
  value = resourcename.dbss
}

2. 根模块调用方式

在根目录的main.tf中直接按你期望的格式调用即可,仅需传入环境变量参数:

module "databases" {
  source      = "./modules/databases"
  environment = var.environment # 把根模块的环境变量传递给子模块
}

# 示例:根模块引用子模块输出的资源
# output "first_db_name" {
#   value = module.databases.db_instances["db_001"].name
# }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:48:00