Terraform подтверждает, что для одной из N переменных установлено значение «true»

У меня есть 4 переменные класса хранения, которым по умолчанию присвоено значение false, а затем установите одну из них на входе в значение "true". Ищете способ проверить, что только для одной из четырех переменных классов хранения установлено значение «истина».

variable "sc1_default" { 
  default = "false"
}

variable "sc1_default" { 
  default = "false"
}

variable "sc3_default" { 
  default = "false"
}

variable "sc4_default" { 
  default = "false"
}


   
on terraform.tfvars  Inputs

sc3_default = "true"
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Валидация полей ввода для базовой формы React
Валидация полей ввода для базовой формы React
В одном из моих проектов MERN Stack есть форма с именем, фамилией, контактным номером, адресом, электронной почтой, датой рождения, номером NIC, весом...
Пользовательские правила валидации в Laravel
Пользовательские правила валидации в Laravel
Если вы хотите создать свое собственное правило валидации, Laravel предоставляет возможность сделать это. Создайте правило с помощью следующей...
2
0
87
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Опция 1

Мы можем сделать это с помощью предварительного условия жизненного цикла в null_resource.

Несколько вещей, прежде чем мы углубимся в код:

  • В вашем коде есть две переменные sc1_default. Я предполагаю, что вторая была опечаткой, и вы имели в виду sc2_default
  • Для дополнительной проверки используйте type в переменных, это хорошая практика, она делает код более читабельным, и если кто-то случайно передаст неправильный тип, код корректно завершится сбоем.

см. пример кода ниже

variable "sc1_default" {
  type    = bool
  default = false
}

variable "sc2_default" {
  type    = bool
  default = false
}

variable "sc3_default" {
  type    = bool
  default = true
}

variable "sc4_default" {
  type    = bool
  default = true
}

resource "null_resource" "validation" {
  lifecycle {
    precondition {
      condition = (
        (var.sc1_default ? 1 : 0) +
        (var.sc2_default ? 1 : 0) +
        (var.sc3_default ? 1 : 0) +
        (var.sc4_default ? 1 : 0)
      ) < 2
      error_message = "Only one sc can be true"
    }
  }
}

Вы можете видеть, что я установил для sc3_default и sc4_default значение true только для того, чтобы вызвать ошибку...

Условие является основой этой проверки. Мы просто добавляем все значения true с помощью сокращенного синтаксиса if (var.sc_default ? 1 : 0), и общее количество должно быть меньше двух. Я предполагаю, что все значения false — это нормально, но если нет, вы можете изменить эту логику. чтобы проверить, что это именно один.

План терраформирования этого кода выдаст следующее сообщение:

Planning failed. Terraform encountered an error while generating this plan.

╷
│ Error: Resource precondition failed
│ 
│   on main.tf line 24, in resource "null_resource" "validation":
│   24:       condition = (
│   25:         (var.sc1_default ? 1 : 0) +
│   26:         (var.sc2_default ? 1 : 0) +
│   27:         (var.sc3_default ? 1 : 0) +
│   28:         (var.sc4_default ? 1 : 0)
│   29:       ) < 2
│     ├────────────────
│     │ var.sc1_default is false
│     │ var.sc2_default is false
│     │ var.sc3_default is true
│     │ var.sc4_default is true
│ 
│ Only one sc can be true

Вариант №2

Если вы можете изменить входные переменные, мы могли бы сократить их до одной с помощью list(bool), код будет меньше, и проверка будет проводиться прямо по переменной.

variable "sc_default" {
  type        = list(bool)
  description = "list of sc default values"
  default     = [false, false, false, false]


  validation {
    condition     = length(var.sc_default) == 4
    error_message = "Four defaults expected"
  }

  validation {
    condition     = sum([for x in var.sc_default : x ? 1 : 0]) < 2
    error_message = "Only one sc can be true"
  }
}

В ответе @helder-sepulveda есть небольшая ошибка: проверка завершится неудачно, если для всех переменных установлено значение "false"

Вот рабочий пример:

variable "sc1_default" {
  default = "true"
}

variable "sc2_default" {
  default = "false"
}

variable "sc3_default" {
  default = "false"
}

variable "sc4_default" {
  default = "true"
}

provider "null" {}

locals {
  joined_scs    = join("", [var.sc1_default, var.sc2_default, var.sc3_default, var.sc4_default])
  scs_are_valid = replace(local.joined_scs, "false", "") == "true"
}

resource "null_resource" "validation" {
  lifecycle {
    precondition {
      condition     = local.scs_are_valid
      error_message = "One and only one SC should be set to true."
    }
  }
}

Бегу terraform plan:

Planning failed. Terraform encountered an error while generating this plan.

│ Error: Resource precondition failed
│ 
│   on main.tf line 27, in resource "null_resource" "validation":
│   27:       condition     = local.scs_are_valid
│     ├────────────────
│     │ local.scs_are_valid is false
│ 
│ One and only one SC should be set to true.

Я рассказал об этом в своем ответе I'm assuming that all false is OK и после этого if not you can change that logic to check that is precisely one

Helder Sepulveda 30.03.2024 15:14

@HelderSepulveda, но это не то, о чем спрашивал ОП: Looking for a way to validate that only one of 4 storage classes variable is set to "true"

Rui Jarimba 30.03.2024 15:16

В точном вопросе говорится: validate that only one of 4 storage classes variable is set to "true". Я думаю, можно с уверенностью предположить, что все четыре ложных значения в порядке, если нет, то в вопросе должно быть явно указано, что оно должно быть ровно одно, а также тот факт, что ОП предоставил образец кода со всеми ложными, подкрепляет мою интерпретацию того, что все ложные являются приемлемо... но в конце это просто интерпретация: английский не мой родной язык... ваша проверка с использованием замены строк - интересный подход

Helder Sepulveda 30.03.2024 15:30

@HelderSepulveda OP предоставил пример кода со всеми переменными, для которых по умолчанию установлено значение false, но, если я не ошибаюсь, его намерение состоит в том, чтобы установить для одной из них значение true в файле terraform.tfvars - проверьте конец его вопроса.

Rui Jarimba 30.03.2024 15:47

конец, который вы имеете в виду sc3_default = "true", который все еще не подтверждает, что он должен быть именно один, я придерживаюсь своей интерпретации, что все ложные - это нормально ... и я четко разъясняю свое предположение в своем ответе ... независимо от того, что теперь у @JonLinux есть несколько отличных примеры, на которых он может поучиться

Helder Sepulveda 30.03.2024 15:53

В качестве альтернативы моему другому ответу мне просто интересно, как именно вы используете переменные класса хранения?

Вместо 4 boolean переменных не проще ли просто объявить одну string переменную и добавить условие, чтобы принимать только допустимые значения?

Например, если предположить, что допустимыми значениями являются sc1, sc2, sc3 и sc4:

variable "storage_class" {
  type        = string
  description = "Value of storage class"

  validation {
    condition     = contains(["sc1", "sc2", "sc3", "sc4"], var.storage_class)
    error_message = "The storage_class must be one of: sc1, sc2, sc3, sc4."
  }
}

Запуск terraform plan с переменной storage_class = "abc":

Planning failed. Terraform encountered an error while generating this plan.

╷
│ Error: Invalid value for variable
│ 
│   on main.tf line 1:
│    1: variable "storage_class" {
│     ├────────────────
│     │ var.storage_class is "abc"
│ 
│ The storage_class must be one of: sc1, sc2, sc3, sc4.

Другие вопросы по теме