Saltar al contenido

¿Hay alguna forma de operador condicional AND/OR en terraform?

Deseamos enseñarte la mejor información que encontramos on line. Nuestro deseo es que te sea de mucha utilidad y si deseas aportar alguna mejora hazlo con total libertad.

Solución:

Esto es más apropiado en la versión actual (0.12.X)

Los operadores soportados son:

Igualdad: == y !=
Comparación numérica: >, <, >=, <=
Lógica booleana: &&, ||, unario !

https://www.terraform.io/docs/configuration/interpolation.html#conditionals

condition_one y condition dos:

count = var.condition_one && var.condition_two ? 1 : 0

condición_uno y NO condición_dos:

count = var.condition_one && !var.condition_two ? 1 : 0

condición_uno O condición_dos:

count = var.condition_one || var.condition_two ? 1 : 0

La respuesta de deniszh está bastante cerca, pero pensé en aclararla un poco y limpiar la sintaxis.

En Terraform, un booleano true se convierte en un 1 y un booleano false se convierte en un 0. Así que si tienes dos variables booleanas, var.foo y var.barpuedes representar AND usando multiplicaciones simples:

count = "$var.foo * var.bar"

En el código anterior, count será 1 solo si var.foo Y var.bar son ambos trueya que 1 * 1 es 1. En todos los demás casos (1 * 0, 0 * 1, 0 * 0), obtienes 0.

Para representar OR, puede aprovechar la función signum(x), que devuelve 1 si el x que pasa es un número positivo, 0 si x es 0, y -1 si x es un número negativo. Teniendo esto en cuenta, aquí está OR:

count = "$signum(var.foo + var.bar)"

En el código anterior, count será 1 si cualquiera var.foo O var.bar es true y 0 solo si ambos son false (signum(1 + 1) = 1, signum(1 + 0) = 1, signum(0 + 1) = 1, signum(0 + 0) = 0).

Tenga en cuenta que para usar las técnicas anteriores, debe tener cuidado de establecer las variables en un booleano y NO en un string. Tu quieres esto:

variable "foo" 
  # Proper boolean usage
  default = true

No esta:

variable "foo" 
  # THIS WILL NOT WORK!
  default = "true"

Para obtener más información sobre cómo hacer una variedad de condicionales de Terraform, consulte los consejos y trucos de Terraform: bucles, declaraciones if y errores y Terraform: en funcionamiento.

Terraform 0.8 agregó soporte de primera clase para la lógica condicional en lugar de las soluciones alternativas anteriores.

Esto usa la sintaxis ternaria clásica, por lo que ahora puede hacer algo como esto:

variable "env"  default = "development" 

resource "aws_instance" "production_server" 
  count = "$var.env == "production" ? 1 : 0"
  ...

Ahora esto solo creará el production_server instancia EC2 cuando env se establece en "production".

También puede usarlo en otros lugares, como establecer una variable/parámetro como este:

variable "env"  default = "development" 
variable "production_variable"  default = "foo" 
variable "development_variable"  default = "bar" 

output "example" 
  value = "$var.env == "production" ? var.production_variable : var.development_variable"

Una cosa a tener en cuenta es que Terraform en realidad evalúa ambos lados antes de elegir el valor utilizado en la declaración ternaria en lugar de evaluar perezosamente solo el lado del ternario que activará la lógica.

Esto significa que no puede hacer algo como este ejemplo reciente de mí tratando de solucionar un problema con el aws_route53_zone fuente de datos:

variable "vpc"    
variable "domain" 

variable "private_zone"   default = "true" 

data "aws_vpc" "vpc" 
  filter 
    name   =   "tag-key"
    values = [ "Name" ]
  
  filter 
    name   =   "tag-value"
    values = [ "$var.vpc" ]
  


data "aws_route53_zone" "private_zone" 
  count        = "$var.private_zone == "true" ? 1 : 0"
  name         = "$var.domain"
  vpc_id       = "$data.aws_vpc.vpc.id"
  private_zone = "true"


data "aws_route53_zone" "public_zone" 
  count        = "$var.private_zone == "true" ? 0 : 1"
  name         = "$var.domain"
  private_zone = "false"


output "zone_id" 
  value = "$var.private_zone == "true" ? data.aws_route53_zone.private_zone.zone_id : data.aws_route53_zone.public_zone.zone_id"

En el ejemplo anterior, esto fallará en el plan porque data.aws_route53_zone.private_zone.zone_id o data.aws_route53_zone.public_zone.zone_id no se define dependiendo de si public_zone se establece en true o false.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *