Terraform 通过命令行传递/覆盖地形对象变量

Terraform 通过命令行传递/覆盖地形对象变量,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}” 这将导致:

我有一个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}”

这将导致:

    {
      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
}