运行 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 init
或 terraform 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
文件,以便记录这些版本选择以备将来使用。
我正在尝试以 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 init
或 terraform 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
文件,以便记录这些版本选择以备将来使用。