如何使用 terraform 0.13.5 检查列表中是否存在该值?
How to check the value is present in list or not using terraform 0.13.5?
我需要检查变量中是否存在值,并根据该值创建资源。
如果 value_list
没有这些 values('abc','def','ghi')
它不应该创建资源。
我在这里尝试的是:
- 将字符串变量转换为列表
- 检查列表是否具有值 'abc' 或 'def' 或 'ghi'。如果
value_list
包含任何一个值,则继续执行后续步骤以创建资源。
- 如果
value_list
没有这些 values('abc','def','ghi')
它不应该创建资源。
variables.tf
variable "value_list" {
default = "abc,def,ghi"
type= string
}
resource.tf
resource "azurerm_kubernetes_cluster_node_pool" "user" {
value_list = ${split(",", var.value_list)}
count = "${contains(value_list,"abc") ? 1 : 0 || contains(value_list,"def") ? 1 : 0 || contains(value_list,"ghi") ? 1 : 0
}
错误:
该语言未使用此字符。
应为表达式的开头,但发现了无效的表达式标记。
如何检查 value_list 是否具有所需的值?
Terraform 具有可以帮助解决此问题的函数:
- https://www.terraform.io/docs/language/functions/contains.html
- https://www.terraform.io/docs/language/functions/setintersection.html
- https://www.terraform.io/docs/language/functions/setsubtract.html
- https://www.terraform.io/docs/language/functions/setunion.html
看起来您正在使用包含,但以一种奇怪的方式,如果您需要拆分某些内容,您可以在本地进行,这样它可用于多个资源,而且您的计数中的表达式看起来也不像是的,您可能想查看相关文档:
https://www.terraform.io/docs/language/meta-arguments/count.html#using-expressions-in-count
这是一个示例用法:
variable "value_list" {
default = "abc,def,ghi"
type = string
}
locals {
vlist = split(",", var.value_list)
}
resource "null_resource" "test_abc" {
count = contains(local.vlist, "abc") ? 1 : 0
provisioner "local-exec" {
command = "echo FOUND;"
}
}
resource "null_resource" "test_xyz" {
count = contains(local.vlist, "xyz") ? 1 : 0
provisioner "local-exec" {
command = "echo FOUND;"
}
}
resource "null_resource" "test_abc_or_def" {
count = (contains(local.vlist, "abc") || contains(local.vlist, "def")) ? 1 : 0
provisioner "local-exec" {
command = "echo FOUND;"
}
}
查看最后一个资源中的计数:
count = (contains(local.vlist, "abc") || contains(local.vlist, "def")) ? 1 : 0
这是一个条件表达式,格式为:
<CONDITION> ? <TRUE VAL> : <FALSE VAL>
条件是在您的示例代码中看起来很奇怪的东西,您可以根据需要拥有任意数量或条件,但不要混合那里的值
( vlist contains "abc"
或 vlist contains "def"
)
( contains(local.vlist, "abc")
|| contains(local.vlist, "def")
)
我需要检查变量中是否存在值,并根据该值创建资源。
如果 value_list
没有这些 values('abc','def','ghi')
它不应该创建资源。
我在这里尝试的是:
- 将字符串变量转换为列表
- 检查列表是否具有值 'abc' 或 'def' 或 'ghi'。如果
value_list
包含任何一个值,则继续执行后续步骤以创建资源。 - 如果
value_list
没有这些values('abc','def','ghi')
它不应该创建资源。
variables.tf
variable "value_list" {
default = "abc,def,ghi"
type= string
}
resource.tf
resource "azurerm_kubernetes_cluster_node_pool" "user" {
value_list = ${split(",", var.value_list)}
count = "${contains(value_list,"abc") ? 1 : 0 || contains(value_list,"def") ? 1 : 0 || contains(value_list,"ghi") ? 1 : 0
}
错误:
该语言未使用此字符。 应为表达式的开头,但发现了无效的表达式标记。
如何检查 value_list 是否具有所需的值?
Terraform 具有可以帮助解决此问题的函数:
- https://www.terraform.io/docs/language/functions/contains.html
- https://www.terraform.io/docs/language/functions/setintersection.html
- https://www.terraform.io/docs/language/functions/setsubtract.html
- https://www.terraform.io/docs/language/functions/setunion.html
看起来您正在使用包含,但以一种奇怪的方式,如果您需要拆分某些内容,您可以在本地进行,这样它可用于多个资源,而且您的计数中的表达式看起来也不像是的,您可能想查看相关文档:
https://www.terraform.io/docs/language/meta-arguments/count.html#using-expressions-in-count
这是一个示例用法:
variable "value_list" {
default = "abc,def,ghi"
type = string
}
locals {
vlist = split(",", var.value_list)
}
resource "null_resource" "test_abc" {
count = contains(local.vlist, "abc") ? 1 : 0
provisioner "local-exec" {
command = "echo FOUND;"
}
}
resource "null_resource" "test_xyz" {
count = contains(local.vlist, "xyz") ? 1 : 0
provisioner "local-exec" {
command = "echo FOUND;"
}
}
resource "null_resource" "test_abc_or_def" {
count = (contains(local.vlist, "abc") || contains(local.vlist, "def")) ? 1 : 0
provisioner "local-exec" {
command = "echo FOUND;"
}
}
查看最后一个资源中的计数:
count = (contains(local.vlist, "abc") || contains(local.vlist, "def")) ? 1 : 0
这是一个条件表达式,格式为:
<CONDITION> ? <TRUE VAL> : <FALSE VAL>
条件是在您的示例代码中看起来很奇怪的东西,您可以根据需要拥有任意数量或条件,但不要混合那里的值
( vlist contains "abc"
或 vlist contains "def"
)
( contains(local.vlist, "abc")
|| contains(local.vlist, "def")
)