在三种不同的环境中,我希望能够根据环境动态设置变量。在下面的示例中,假设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
instance_type = "t2.medium"
instance_type = "t2.large"
variable "instance_type" {
description = "EC2 Instance Type"
}
resource "aws_instance" "instance" {
...
instance_type = "${var.instance_type}"
...
}
答案 0 :(得分:3)
调整结构,这是我对您的应用程序的理解。
NULL
├── 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
答案 1 :(得分:0)
我一直在尝试实现直觉上相似的东西,似乎这是应该如何工作的,但是我得出的结论是,模块根本不是为此用例设计的。 基本上,您正在为测试/产品中不存在的变量分配值,以解决此问题,而不是在.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}"
}
在这种情况下,您可以快速看到这与模块的目的背道而驰。
详细地说,我认为模块并不是为了每个模块定义单个资源而能够动态填充其值,而是为了在模块内创建资源的“集合”,以便它们可以共享/重用相同的变量。
请注意,当您为 module call 中的instance_type
键分配值时,实际上是将该值传递给模块输入变量然后以相同的名称分配给资源密钥。