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

Terraform如何从路径获取父模块名并传递给其他子模块

答案

首先明确:Terraform没有内置的this.module.name这类属性来直接获取当前模块的调用名称,你示例中的原生写法无法直接运行,但你的核心需求(跨模块传递路径、访问指定目录下的文件)完全可以通过替代方案实现。

核心问题说明

你示例中locals.os_module_name = this.module.name的写法是无效的:Terraform出于模块封装的设计,不会将模块的调用名称、父模块上下文这类元数据暴露给模块内部,所有模块的外部输入只能通过variable变量传递。

可行实现方案

针对你需要访问child2模块下src/yaml目录的场景,推荐两种方案,按需选择:

方案1:使用内置路径变量(最推荐,无需传递模块名)

Terraform提供了内置路径变量path.module,返回当前.tf文件所属模块的本地文件系统路径,完全不需要依赖模块名称即可拼接相对路径。
如果你要读取的是child2模块源码自带的YAML文件,甚至不需要从child1传递路径参数,直接在child2模块内部自行拼接即可:

# Child2模块内直接读取自身目录下的文件,无需外部传路径
locals {
  exclusions = yamldecode(file("${path.module}/src/yaml/exclusions.yaml"))
}

如果确实需要在child1中拼接child2的路径,也可以用path.module基于child1的目录拼相对路径即可。

方案2:手动显式传递模块调用名

如果你的逻辑必须依赖父模块的调用名称,直接新增变量手动传递即可,稳定性最高:

  1. 父模块调用child1时新增变量传递模块名:
# 父模块配置
module "parent" {
  source = "s3::https://s3.amazonaws.com/tf-modules-zip/child1.zip"
  some_variable = "foo"
  # 手动传递你给当前模块定义的调用名
  module_call_name = "parent"
}
  1. child1模块新增对应变量接收,再拼接路径:
# Child1模块新增变量
variable "module_call_name" {
  type        = string
  description = "当前模块被调用时定义的名称"
}

locals {
  path_to_yamls  = "${var.module_call_name}/child2/src/yaml"
}

# 调用child2模块传递路径
module "child2" { 
  source = "s3::https://s3.amazonaws.com/tf-modules-zip/child2.zip"
  some_variable = var.some_variable
  path_to_yaml_files = local.path_to_yamls
}

示例其他注意点

你给出的示例代码还有两处语法问题需要修正:

  • null_resource的执行命令块需要加provisioner关键字,正确写法是provisioner "local-exec" { ... }
  • yamldecode返回的是结构化对象,不能直接拼接在Shell命令中,需要用yamlencode()或者jsonencode()转成字符串后再使用

内容的提问来源于stack exchange,提问作者Aléxis Mosquera Caicedo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:36:09