Terraform 源代码中的两个斜杠如何工作?

问题描述 投票:0回答:1

这是我的 Terraform Karpenter 模块:

module "karpenter" {
  source = "terraform-aws-modules/eks/aws//modules/karpenter"
  cluster_name = module.eks.cluster_name
  node_iam_role_additional_policies = {
    AmazonSSMManagedInstanceCore = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
  }
}

您可以看到

source
在“aws”和“modules”之间有两个斜杠。我最初以为我犯了一个错误,但事实证明两条斜线效果很好。

文档也有两个斜杠。

如果我更新为一个斜杠并运行

terraform apply
,它实际上会抛出错误:

│ Error: Invalid module source address
│
│   on main.tf line 73, in module "karpenter":
│   73:   source       = "terraform-aws-modules/eks/aws/modules/karpenter"
│
│ Terraform failed to determine your intended installation method for remote module package "terraform-aws-modules/eks/aws/modules/karpenter".
│
│ If you intended this as a path relative to the current module, use "./terraform-aws-modules/eks/aws/modules/karpenter" instead. The "./" prefix indicates that the address is a relative filesystem path.
╵

这是我运行

.terraform
terraform init
的文件夹结构:

enter image description here

出于好奇,有人可以帮忙解释一下这条带有两个斜杠的路径在源代码中是如何工作的吗?谢谢!

terraform karpenter
1个回答
0
投票

在 Terraform 模块源路径中使用双斜杠 (

//
) 引用模块存储库中的子目录。让我尝试以最好的方式解释这一点。

Terraform 允许模块源地址采用不同的形式:

  • 本地路径
  • Git 存储库
  • Terraform 注册表模块

要指定 Terraform 注册表模块或 Git 存储库中的子目录,请在源路径中使用

//

source = "<module-source>//<subdirectory>"

您的情况:

source = "terraform-aws-modules/eks/aws//modules/karpenter"
  • terraform-aws-modules/eks/aws
    指向 Terraform 注册表上的模块。
  • //modules/karpenter
    告诉 Terraform 使用该模块内的
    karpenter
    子目录。

使用单斜杠 (

/
) 会导致错误:

source = "terraform-aws-modules/eks/aws/modules/karpenter"

出现此错误是因为 Terraform 将此解释为本地相对路径,而不是注册表模块中的子目录,从而导致模块源地址无效错误。

运行后

terraform init
,Terraform 将模块存储在:

  • .terraform/modules/

此目录反映了您的配置中指定的模块路径。

总而言之,使用

//
正确地将 Terraform 定向到远程模块存储库中的子目录,避免路径解释问题。有关更多详细信息,请查看有关包子目录中模块的 Terraform 文档

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.