Как написать условный оператор if, else, elsif в Terraform

#terraform #terraform-provider-aws

#terraform #terraform-provider-aws

Вопрос:

Есть ли способ написать условный оператор с несколькими ветвями в terraform?

Я настраиваю модуль terraform для создания кластера Amazon Aurora. Мне нужно иметь опцию для репликации между регионами, поэтому мне нужно определить регион реплики по отношению к исходному региону.

Ответ №1:

Это один из способов использования функции coalesce():

 locals{
  prod = "${var.environment == "PROD" ? "east" : ""}"
  prod2 = "${var.environment == "PROD2" ? "west2" : ""}"
  nonprod = "${var.environment != "PROD" amp;amp; var.environment != "PROD2" ? "west" : ""}"
  region = "${coalesce(local.prod,local.prod2, local.nonprod)}"
}
  

Комментарии:

1. Определенно, это правильный путь, для получения более подробной информации я тоже нашел это полезным ataiva.com/how-to-write-if-else-statements-in-terraform

Ответ №2:

 locals {
  test = "${ condition ? value : (elif-condition ? elif-value : else-value)}"
}
  

Для более буквального подхода «if-elif-else» вы можете встроить короткую комбинацию if с другими, чтобы получить аналогичный эффект. Если ваш вариант использования также находится внутри цикла for, вы также можете это сделать:

 locals {
  test = {
    for i in list : 
      key => "${ condition ? value : (elif-condition ? elif-value : else-value)}"
  }
}
  

Будет работать в любой ситуации, когда вы будете использовать синтаксис «$ {}»

Комментарии:

1. это просто потрясающий ответ!

Ответ №3:

Вы могли бы попробовать просто использовать map и lookup . Пример:

 /* In your variables.tf */
variable "region_mapping" {
  description = "mapping for cross-region replication"
  default = {
    "us-east-1" = "us-east-2",
    "us-west-1" = "us-west-2"
  }
}

/* Then create use lookup to get the replication region from the deployment region */
resource "example" "example" {
  region = "${lookup(var.region_mapping, var.region)}"
}
  

Если var.region — это место, где у вас развернут ваш текущий кластер, и его значение, например, us-east-1 , то поиск вернет us-east-2 регион, в котором вы должны развертывать свою реплику.

Настройте это в соответствии с вашими потребностями.

Комментарии:

1. Это помогает, в конечном итоге я использую list вместо map, который мне нужен count.index, чтобы найти значение, спасибо @Esteban Garcia

Ответ №4:

Начиная с terraform 0.12, вы можете подделать переключатель, используя карты, например

 locals {
  environments = {
    prod = "east",
    prod2 = "west2"
  }
  
  region = lookup(environment_region, lower(var.environment), "west")
}
  

Преимущество этого в том, что если результат более сложный, вы можете возвращать объекты / списки с карты, а не простые строки.

Например, у меня есть централизованный модуль именования, который составляет имя в соответствии с различными правилами, основанными на типе ресурса и т.д.

 locals {
  parts_map = {
    # NB Location should always be last to ensure geo-separation of names
    prefix = [ local.type.code, var.name, var.role, var.environment, module.location.code ]
    suffix = [ var.name, var.role, var.environment, local.type.code, module.location.code ]
    mode3  = [ var.name, local.type.code, var.role, var.environment, module.location.code ]
}

parts = compact(local.parts_map[local.type.order])
  

Ответ №5:

Я занимался этим несколько часов, пытаясь создать массив для выполнения моего требования. Основываясь на ответе от @MrJ1m0thy, я создаю этот троичный файл с несколькими параметрами, который эмулирует if / elseif / else:

 conditioning_a != "condition_a" ? "value1" : (conditioning_b == "condition_b" ? "value_b" : (conditioning_c == "condition_c" ? "value_c" : (conditioning_d == "condition_d" ? "value_d" : "value2")))
  

Комментарии:

1. приятно!! каскадные условные операторы сработали для меня.

Ответ №6:

Не существует такого понятия, как if / elseif / else в Terraform < 0.12

Однако вы можете использовать классическую логическую логику в условиях Terrafom