Как проверить, присутствует ли значение в списке или нет, используя terraform 0.13.5?

Мне нужно проверить значение, которое существует в переменной или нет, и на основе этого мне нужно создать ресурсы. Если у 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 желаемое значение или нет?


person bluebud    schedule 03.03.2021    source источник
comment
Не могли бы вы настроить код, который у вас есть в вашем вопросе, чтобы сформировать минимально воспроизводимый пример, пожалуйста? Прямо сейчас у вас есть биты, которые делают это неработоспособным, и трудно понять, способствует ли это вашей ошибке или где еще лежит ошибка.   -  person ydaetskcoR    schedule 03.03.2021


Ответы (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" ИЛИ vlist contains "def" )

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

person Helder Sepulveda    schedule 03.03.2021