У меня есть 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"



Мы можем сделать это с помощью предварительного условия жизненного цикла в null_resource.
Несколько вещей, прежде чем мы углубимся в код:
sc1_default. Я предполагаю, что вторая была опечаткой, и вы имели в виду sc2_defaulttype в переменных, это хорошая практика, она делает код более читабельным, и если кто-то случайно передаст неправильный тип, код корректно завершится сбоем.см. пример кода ниже
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
Если вы можете изменить входные переменные, мы могли бы сократить их до одной с помощью 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.
@HelderSepulveda, но это не то, о чем спрашивал ОП: Looking for a way to validate that only one of 4 storage classes variable is set to "true"
В точном вопросе говорится: validate that only one of 4 storage classes variable is set to "true". Я думаю, можно с уверенностью предположить, что все четыре ложных значения в порядке, если нет, то в вопросе должно быть явно указано, что оно должно быть ровно одно, а также тот факт, что ОП предоставил образец кода со всеми ложными, подкрепляет мою интерпретацию того, что все ложные являются приемлемо... но в конце это просто интерпретация: английский не мой родной язык... ваша проверка с использованием замены строк - интересный подход
@HelderSepulveda OP предоставил пример кода со всеми переменными, для которых по умолчанию установлено значение false, но, если я не ошибаюсь, его намерение состоит в том, чтобы установить для одной из них значение true в файле terraform.tfvars - проверьте конец его вопроса.
конец, который вы имеете в виду sc3_default = "true", который все еще не подтверждает, что он должен быть именно один, я придерживаюсь своей интерпретации, что все ложные - это нормально ... и я четко разъясняю свое предположение в своем ответе ... независимо от того, что теперь у @JonLinux есть несколько отличных примеры, на которых он может поучиться
В качестве альтернативы моему другому ответу мне просто интересно, как именно вы используете переменные класса хранения?
Вместо 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.
Я рассказал об этом в своем ответе
I'm assuming that all false is OKи после этогоif not you can change that logic to check that is precisely one