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.bar
puedes 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 true
ya 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.