如何在 Terraform 中定义可选变量并在 Consul 中定义默认值

问题描述 投票:0回答:4

我有一个 Terraform 脚本,其中包含一些从 Consul 填充的变量。我想在两种不同的场景中使用这个脚本:

  • 场景 1. 使用 Consul 的默认值一切正常。
  • 场景2.我需要覆盖一些变量。

我检查了 Terraform 文档,发现我无法使用 Consul 中定义的变量作为其他变量的默认值。所以我最终采用了以下解决方法:

## vars.tf
## emulating undefined value using "null" string
variable "my_optional_variable" { default = "null" } 

## main.tf
my_optional_variable = "${var.my_optional_variable == "null" ? data.consul_keys.my_optional_variable : var.my_optional_variable}"

有人可以告诉我更好的方法吗? 如何避免使用“空”字符串进行黑客攻击?

谢谢

terraform consul
4个回答
20
投票

另一个选项是

coalesce
,它适用于空字符串,因此比您的
"null"
字符串稍好一些。

给定您的场景或具有两个变量/数据源的类似案例

variable "my_default_value" {
  default = "CentOS 7"
}
variable "my_optional_variable" {
  default = ""
}

您可以从给定参数中获取 “第一个非空值。必须至少提供两个参数。”

data "openstack_images_image_v2" "bastion_image" {
  name = "${coalesce(var.my_optional_variable, var.my_default_value)}"
}

7
投票

如果您的可选变量需要来自外部或来自声明的资源,您可以使用

count
和三元组来完成此操作。

variable "my_variable_id" {
    type = string
    default = ""
}

resource "cloud_resource" "my_resource" {
    count = var.my_variable == "" ? 1 : 0
    other_params = {...}
}

resource "dependent_cloud_resource" "my_other_resource" {
    other_resource_id = var.my_variable_id == "" ? cloud_resrouce.my_resource[0].id : var.my_variable_id
}



3
投票

您可以使用覆盖文件。所以,如果你有

vars.tf
包含:

variable "my_optional_variable" {
  default = "null"
}

override.tf
包含:

variable "my_optional_variable" {
  default = "not null"
}

那么

${var.my_optional_variable}
应等于
not null
。覆盖文件最后加载并合并到您的配置中。然后像目录中的其他
.tf
文件一样附加在一起。


0
投票

在最新的 Terraform 版本中,您可以使用关键字“可选”来定义可选变量。这是一个例子

variable "ip_restriction" {
  type = list(object({
    action                    = optional(string)
    ip_address                = optional(string)
    name                      = optional(string)
    priority                  = optional(number)
    service_tag               = optional(string)
    virtual_network_subnet_id = optional(string)
    headers = optional(object({
      x_azure_fdid      = optional(list(string))
      x_fd_health_probe = optional(bool)
      x_forwarded_for   = optional(list(string))
      x_forwarded_host  = optional(list(string))
    }))
  }))
  default = []
}
© www.soinside.com 2019 - 2024. All rights reserved.