Terraform中path.module为何指向当前目录而非模块所在目录?
问题根因
path.module的取值永远和表达式所在的.tf文件所属模块绑定,和当前文件调用什么外部模块没有关系。
你把user_data = file("${path.module}/startup.sh.tpl")写在了调用ec2模块的上层配置(即执行terraform命令的当前上下文配置)中,这里的path.module自然返回当前配置所在的目录.,不会自动指向引用的../../modules/ec2/模块目录。
之前写死../../modules/ec2/startup.sh.tpl路径能正常执行,本质是手动在上层配置里拼对了目标文件相对于当前目录的路径,不属于模块配置的合理写法。
正确修复方案
优先使用模块标准封装逻辑处理,避免路径硬编码:
- 把
startup.sh.tpl保留在../../modules/ec2/模块目录下 - 删除上层
module "instance"块里的user_data传参行 - 打开
../../modules/ec2/目录下定义EC2实例的.tf文件,在对应的aws_instance资源块内部添加配置:
resource "aws_instance" "this" { # 模块原有其他配置保持不变 user_data = file("${path.module}/startup.sh.tpl") }
此时${path.module}写在ec2模块自身的配置文件中,会自动定位到ec2模块的目录,无论在什么层级的配置里调用这个ec2模块,都能正确找到同目录下的脚本文件,不需要手动拼接相对路径。
如果确实需要在调用模块的上层配置里指定user_data文件,就把startup.sh.tpl放在上层配置的目录下,原有${path.module}/startup.sh.tpl写法即可正常运行,无需修改路径。
注意:Terraform所有路径类内置常量的求值上下文都是表达式所在的文件,不会因为表达式写在module块中就切换到被调用模块的上下文。
内容的提问来源于stack exchange,提问作者Bradx1
相关产品推荐
相关产品推荐

