运行 terraform init 位于仅包含引用 git 源的 tfvars 文件的目录中

Running terraform init in a directory that only contains a tfvars file that references a git source

我正在尝试以 Terraform Up 和 运行 一书末尾描述的方式使用 Terraform。所描述的模式表明,您可以通过为每个环境(例如 prod、dev、ad-hoc 开发人员环境等)使用 *.tfvars 文件来拥有一个定义实时环境的存储库。这些 *.tfvars 文件参考另一个仓库中的模块是这样的:

source = "git::https://github.com/github-user/my-module.git?ref=v0.0.1"

# required variables for `my-module` defined here
foo="bar"

这个模式对我来说很有意义,它很干 d 还可以轻松比较环境之间的配置差异。

当我尝试在一个目录中 运行 terraform init 包含一个名为 terraform.tfvars 的文件并引用我的远程模块时,我收到错误。这是我的 terraform.tfvars 文件:

source = "git::https://github.com/briancaffey/terraform-aws-django.git?ref=v0.0.2"

region="us-east-1"
...

这是我在 运行 terraform initterraform init -var-file terraform.tfvars 或如果我为我的 s3 后端指定 -backend-config 值时得到的错误:

Terraform initialized in an empty directory!

The directory has no Terraform configuration files. You may begin working
with Terraform immediately by creating Terraform configuration files.

我很难找到显示此模式的示例,而且我在 terraform 文档中也找不到任何显示如何在 *.tfvars 文件中使用 source 的内容。

我想做的事情可行吗?我不确定这是否会使事情复杂化,但我尝试引用的远程 terraform 模块也已发布到官方 terraform 注册表:https://registry.terraform.io/modules/briancaffey/django/aws/latest.

一个.tfvars文件用于为根模块的输入变量提供值。名称 source 在该上下文中没有特殊含义,如果初始化成功(如果您的目录中至少有一个 .tf 文件),那么对该配置的后续操作将报告有名为 source 的根模块中没有变量。 (确实,不可能,因为 source 是一个保留变量名。)

如果您的目标是直接使用具有一组特定输入变量的外部模块,那么最小的配置结构是一个包含单个 .tf 文件(任何名称都可以)的目录以下内容:

module "main" {
  source = "git::https://github.com/briancaffey/terraform-aws-django.git?ref=v0.0.2"

  region = "us-east-1"
}

这指定了模块的位置和传递给它的输入变量。然后,您可以将此目录用于我认为您想要的工作流程:

  • terraform init初始化目录,包括将模块源码下载到本地目录,以便后续命令引用。
  • terraform apply 应用生成的配置。

此最小配置未在其自己的根模块中定义任何输入变量,因此您不需要任何 .tfvars 文件或其他文件即可使用它。但是,当您 运行 terraform init Terraform 本身会生成一个 .terraform.lock.hcl 文件来记录提供程序版本选择,因此如果您打算将此配置保持在版本控制之下,那么您应该包含该生成的文件以及您的 hand-written .tf 文件,以便记录这些版本选择以备将来使用。