我有一个 Terraform 脚本,其中包含一些从 Consul 填充的变量。我想在两种不同的场景中使用这个脚本:
我检查了 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}"
有人可以告诉我更好的方法吗? 如何避免使用“空”字符串进行黑客攻击?
谢谢
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)}"
}
如果您的可选变量需要来自外部或来自声明的资源,您可以使用
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
}
您可以使用覆盖文件。所以,如果你有
vars.tf
包含:
variable "my_optional_variable" {
default = "null"
}
和
override.tf
包含:
variable "my_optional_variable" {
default = "not null"
}
那么
${var.my_optional_variable}
应等于 not null
。覆盖文件最后加载并合并到您的配置中。然后像目录中的其他 .tf
文件一样附加在一起。
在最新的 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 = []
}