为什么${path.module}指向当前目录“.”,而不是模块目录?

Bra*_*dx1 16 terraform

我使用了以下代码:

\n
module "instance" {\n  for_each               = var.worker_private_ip\n  source                 = "../../modules/ec2"\n  env                    = var.env\n  project_name           = var.project_name\n  ami                    = var.ami\n  instance_type          = var.instance_type\n  subnet_id              = module.vpc.subnet_id\n  vpc_security_group_ids = [module.security_group.security_group_id]\n  private_ip             = each.value\n  key_name               = var.public_key_name\n  user_data              = file("${path.module}/startup.sh.tpl")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当我发送 terraform plan/apply 命令时,收到错误

\n
path.module is "."\n\n\xe2\x94\x82 Invalid value for "path" parameter: no file exists at "./startup.sh.tpl";\n
Run Code Online (Sandbox Code Playgroud)\n

因此,terraform 在当前目录中搜索文件,但我希望在 (../../modules/ec2/) 中搜索

\n

我在模块文件夹中有startup.sh.tpl 文件,如果我将user_data 设置为:

\n
user_data              = file("../../modules/ec2/startup.sh.tpl")\n
Run Code Online (Sandbox Code Playgroud)\n

一切都很好,如果我将 sciprt 移动到当前目录,一切也都很好,计划和应用命令是正确的

\n

我究竟做错了什么?为什么${path.module}指向当前目录".",而不是指向../../modules/ec2/

\n

Erv*_*gyi 19

来自文档

path.module是放置表达式的模块的文件系统路径。

这意味着它将返回项目根文件夹和path.module使用位置之间的相对路径。

例如:

  • .tf如果您在文件夹内的文件中使用它../../modules/ec2/,它将返回../../modules/ec2;
  • 如果您在项目根文件夹中的main.tf(或任何文件)中使用它,它将返回.tf.

在您的情况下,如果用户数据位于模块内部,则可能需要将其作为输入。