如何将 tfvar 与模块一起使用

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

对于三种不同的环境,我希望能够根据环境动态设置变量。在下面的示例中,假设 dev 和 prod 之间的实例类型不同。我无法在模块中引用

instance_type
,除非我在
vars.tf
旁边有一个
terraform.tfvars
文件。

我得到的错误是:

unknown variable referenced: 'instance_type'. define it with 'variable' blocks

如果是这样的话,那么这个文件不就是

modules/apollo/vars.tf
下的同一个文件吗?

我认为

modules/apollo/vars.tf
定义了模块所需的必要变量。我认为在
env-dev/services/apollo/
下的“根”级别内没有必要。如果有“更好”的方法来做到这一点,我洗耳恭听。

├── env-dev
│   └── services
│       └── apollo
│           ├── main.tf
│           ├── terraform.tfvars    
│           └── vars.tf # Do i need this?
├── env-test
├── global
├── mgmt
└── modules
    ├── apollo
    │   ├── main.tf
    │   ├── user_data.tpl
    │   └── vars.tf
    └── defaults
        └── main.tf

env-dev/services/apollo/terraform.tfvars

instance_type    = "t2.medium"

env-prod/services/apollo/terraform.tfvars

instance_type    = "t2.large"

模块/apollo/vars.tf

variable "instance_type" {
  description = "EC2 Instance Type"
}

模块/apollo/main.tf

resource "aws_instance" "instance" {     
  ...
  instance_type           = "${var.instance_type}"
  ...
}
terraform
2个回答
3
投票

调整结构,这是我对你的应用的理解。

├── dev
│   └── apollo_terraform.tfvars    
├── test
│   └── apollo_terraform.tfvars
├── global
│   └── apollo_terraform.tfvars
├── mgmt
│   └── apollo_terraform.tfvars
├── main.tf,  vars.tf, output.tf, apollo.tf, default.tf, etc
└── modules
    ├── apollo
    │   ├── main.tf
    │   ├── user_data.tpl
    │   └── vars.tf
    └── defaults
        └── main.tf

apollo.tf
将有源模块代码来使用共享模块
apollo
default.tf

的设置相同

你的计划/应用命令应该是这样的:

terraform plan -var-file=${env}/apollo_terraform.tfvars

3
投票

我一直在尝试实现类似的东西,直观上看起来这就是它应该如何工作,但是我得出的结论是模块根本不是为这个用例而设计的。 基本上,您正在为测试/产品中不存在的变量分配值,要解决此问题,而不是在 .tfvars 中提供分配,您可以尝试使用默认值声明它们: env-dev/services/apollo/variables.tf

variable "instance_type" {
 default = "t2.medium"
}

env-prod/services/apollo/variables.tf

variable "instance_type" {
 default = "t2.large"
}

声明并分配默认值的变量仍然不会自动将它们链接到模块中声明的输入变量,因此 另外,在

env-dev/services/apollo/main.tf
env-prod/services/apollo/main.tf
中,您仍然需要填写模块的属性:

module "aws_inst" {
 source = "..\\..\\..\\modules\\apollo"
 instance_type = "${var.instance_type}"
}

您可以很快看到在这种情况下这如何违背了模块的目的。

详细来说,我认为模块并不是为每个模块定义单个资源以便能够动态填充其值而设计的,而是为了在模块内创建资源“集合”,以便它们可以共享/重用相同的变量。

请注意,当您在

模块调用中为instance_type键赋值时,您实际上将该值传递给模块输入变量,然后将其分配给同名的资源键。

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