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:手动显式传递模块调用名
如果你的逻辑必须依赖父模块的调用名称,直接新增变量手动传递即可,稳定性最高:
- 父模块调用child1时新增变量传递模块名:
# 父模块配置 module "parent" { source = "s3::https://s3.amazonaws.com/tf-modules-zip/child1.zip" some_variable = "foo" # 手动传递你给当前模块定义的调用名 module_call_name = "parent" }
- 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
相关产品推荐
相关产品推荐

