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

