我正在尝试以terraform Up and Running一书末尾所描述的方式使用terraform。所描述的模式表明,您可以有一个repo,通过为每个环境(如prod、dev、ad-hoc开发人员环境等(使用*.tfvars
文件来定义您的实时环境。这些*.tfvars
文件引用了另一个repot中的模块,如下所示:
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
的内容。
我想做的事情可能吗?我不确定这是否会使事情复杂化,但我试图引用的远程地形模块也发布到了官方地形注册中心: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
初始化目录,包括将模块源代码下载到本地目录中,以便后续命令可以引用它- CCD_ 18来应用所得到的配置
这个最小配置在它自己的根模块中没有定义任何输入变量,所以你不需要任何.tfvars
文件或其他文件来使用它。但是,当你运行terraform init
时,Terraform会自己生成一个.terraform.lock.hcl
文件,记录提供程序的版本选择,因此,如果您打算将此配置置于版本控制之下,那么您应该将生成的文件与手写的.tf
文件一起包括在内,以便记录这些版本选择以供将来使用。