Terraform 通过命令行传递/覆盖地形对象变量
我有一个Terraform配置(v0.14,AWS provider 3.32.0),其中我将某些资源类型的参数定义为对象(输入变量)。以下是一个(简化的)示例: 但是,我希望能够通过命令行或环境变量覆盖各个值。 我可以覆盖对象的单个值而不必传递整个对象吗?因此,使用默认值并根据需要覆盖它们: e。GTerraform 通过命令行传递/覆盖地形对象变量,terraform,terraform-provider-aws,terraform0.12+,Terraform,Terraform Provider Aws,Terraform0.12+,我有一个Terraform配置(v0.14,AWS provider 3.32.0),其中我将某些资源类型的参数定义为对象(输入变量)。以下是一个(简化的)示例: 但是,我希望能够通过命令行或环境变量覆盖各个值。 我可以覆盖对象的单个值而不必传递整个对象吗?因此,使用默认值并根据需要覆盖它们: e。G TF\u VAR\u docker\u config.internal=1234 或 TF\u VAR\u docker\u config=“{internal=1234}” 这将导致:
TF\u VAR\u docker\u config.internal=1234
或
TF\u VAR\u docker\u config=“{internal=1234}”
这将导致:
{
internal = 1234
external = 8300
protocol = "tcp"
}
我的测试不起作用。可能吗?如果是,怎么做?遗憾的是,你不能直接这样做。在不久的将来,应该将添加到
对象
,这将简化此操作
目前,一个非完美的解决方案可以与常规地图一起使用:
variable "docker_config_default" {
type = object({
internal = number
external = number
protocol = string
})
default = {
internal = 8300
external = 8300
protocol = "tcp"
}
}
variable "docker_config" {
type = map
validation {
# condition is not perfect and suited only for one
# attribute overwrite
condition = (can(var.docker_config["internal"])
|| can(var.docker_config["external"])
|| can(var.docker_config["protocol"]))
error_message = "Must have internal, external or protocol."
}
}
locals {
docker_config = merge(var.docker_config_default, var.docker_config)
}
output "test" {
value = local.docker_config
}
您只需在代码中使用local.docker\u config
。太糟糕了。我希望这样可以配置资源(RDS、ECS等),而不必维护大量单独的变量(每个参数一个变量)。然而,如果我需要一个额外的默认对象和每个对象的合并,这并不是代码的简化。不过还是要谢谢你,这是一个有趣的主意,我以后肯定会用到的@Stefan可选
对象
的关键字将简化此操作,但您仍然需要合并
。
variable "docker_config_default" {
type = object({
internal = number
external = number
protocol = string
})
default = {
internal = 8300
external = 8300
protocol = "tcp"
}
}
variable "docker_config" {
type = map
validation {
# condition is not perfect and suited only for one
# attribute overwrite
condition = (can(var.docker_config["internal"])
|| can(var.docker_config["external"])
|| can(var.docker_config["protocol"]))
error_message = "Must have internal, external or protocol."
}
}
locals {
docker_config = merge(var.docker_config_default, var.docker_config)
}
output "test" {
value = local.docker_config
}