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