Pass/Override Terraform 对象变量通过命令行

Pass/Override Terraform object variable via command line

我有一个 Terraform 配置(v0.14,AWS 提供商 3.32.0),我在其中将某些资源类型的参数定义为对象(输入变量)。这是一个(简化的)示例:

variable "docker_config" {
  type = object({
    internal = number
    external = number
    protocol = string
  })
  default =
    {
      internal = 8300
      external = 8300
      protocol = "tcp"
    }
}

但是,我希望能够通过命令行或环境变量覆盖单个值。 我可以覆盖对象的个别值而不必传递整个对象吗?因此,使用默认值并根据需要覆盖它们:

e。 G。 TF_VAR_docker_config.internal = 1234

TF_VAR_docker_config = "{internal = 1234}"

这将导致:

    {
      internal = 1234
      external = 8300
      protocol = "tcp"
    }

我的测试没有成功。可能吗?如果是,如何?

遗憾的是,您不能直接执行此操作。在不久的将来,optional 应该添加到 object 中,这将简化这一点。

目前,一个不完美的 解决方法 可能是将 merge 与常规 map:

一起使用
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_config