如何在Terraform中从其他文件输出资源值?
Terraform输出配置报错解决方法
问题场景
项目目录结构如下:
- services
- dns.tf
- app
- outputs.tf
services/dns.tf中定义了两个Cloudflare DNS记录资源:
resource "cloudflare_record" "pgsql_master_record" { count = var.pgsql_enabled ? 1 : 0 zone_id = data.cloudflare_zone.this.id name = "${var.name}.pg.${var.jurisdiction}" value = module.db[0].primary.ip_address.0.ip_address type = "A" ttl = 3600 } resource "cloudflare_record" "redis_master_record" { count = var.redis_enabled ? 1 : 0 zone_id = data.cloudflare_zone.this.id name = "${var.name}.redis.${var.jurisdiction}" value = module.redis[0].host type = "A" ttl = 3600 }
尝试在app/outputs.tf中添加输出配置:
output "psql_master_record" { value = cloudflare_record.pgsql_master_record[*].hostname } output "redis_master_record" { value = cloudflare_record.redis_master_record[*].hostname }
执行Terraform时收到错误:
未在根模块中声明托管资源 "cloudflare_record" "redis_master_record"。
报错原因
Terraform默认仅加载根目录下的配置文件,子目录(如services、app)中的代码不会被自动纳入根模块作用域。app/outputs.tf属于独立子目录,无法直接引用另一个子目录services中定义的资源,因为这些资源不在根模块的识别范围内。
解决方法
方法1:迁移输出配置到根目录
直接将app/outputs.tf移动到项目根目录,此时输出配置处于根模块作用域,可直接引用services目录中定义的资源(Terraform会自动加载所有子目录下的.tf文件到根模块)。
方法2:通过模块规范引用资源
如果需要保留子目录结构,需将services声明为模块,通过模块输出暴露资源属性,再在根模块中引用:
- 在
services目录下创建outputs.tf,暴露需要的资源属性:
output "pgsql_master_hostname" { value = cloudflare_record.pgsql_master_record[*].hostname } output "redis_master_hostname" { value = cloudflare_record.redis_master_record[*].hostname }
- 在根目录创建
main.tf,调用services模块并传递所需变量:
module "services" { source = "./services" # 根据services模块的变量声明传递对应值 pgsql_enabled = var.pgsql_enabled redis_enabled = var.redis_enabled name = var.name jurisdiction = var.jurisdiction }
- 修改输出配置(建议移至根目录),引用模块输出:
output "psql_master_record" { value = module.services.pgsql_master_hostname } output "redis_master_record" { value = module.services.redis_master_hostname }
内容的提问来源于stack exchange,提问作者eljoeyjojo
相关产品推荐
相关产品推荐

