【问题标题】:How to check the value is present in list or not using terraform 0.13.5?如何使用 terraform 0.13.5 检查列表中是否存在值?
【发布时间】:2021-06-01 20:15:18
【问题描述】:

我需要检查变量中是否存在值,并根据该值创建资源。 如果value_list 没有这些values('abc','def','ghi') 它不应该创建资源。

我在这里尝试的是:

  1. 将字符串变量转换为列表
  2. 检查列表的值是否为“abc”或“def”或“ghi”。如果value_list 包含任何值,则继续执行后续步骤以创建资源。
  3. 如果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 是否具有所需的值?

【问题讨论】:

  • 能否调整问题中的代码以形成minimal reproducible example?现在你有一些位使得它无法运行,很难知道这是否导致了你的错误或错误在哪里。

标签: terraform contains azure-resource-manager terraform-provider-azure azure-rm


【解决方案1】:

Terraform 的功能可以帮助解决这个问题:

看起来您正在使用包含,但是以一种奇怪的方式,如果您需要拆分某些内容,您可以在本地执行它,这样它可用于多个资源,而且您的计数中的表达式也不适合您可能需要查看相关文档:
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" OR vlist contains "def" )

( contains(local.vlist, "abc") || contains(local.vlist, "def") )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    相关资源
    最近更新 更多