如何使用 if, else, elsif 语句创建 Terraform?

Con*_*tMR 13 terraform terraform-provider-aws

我正在设置一个 terraform 模块来创建一个 Aurora 集群。
我需要有一个跨区域复制的选项,所以我需要决定与源区域相关的副本区域。
有没有办法在 terraform 中做一个有条件的多选项?

vic*_*r m 19

这是使用 coalesce() 函数的一种方法:

locals{
  prod = "${var.environment == "PROD" ? "east" : ""}"
  prod2 = "${var.environment == "PROD2" ? "west2" : ""}"
  nonprod = "${var.environment != "PROD" && var.environment != "PROD2" ? "west" : ""}"
  region = "${coalesce(local.prod,local.prod2, local.nonprod)}"
}
Run Code Online (Sandbox Code Playgroud)


MrJ*_*thy 11

locals {
  test = "${ condition ? value : (elif-condition ? elif-value : else-value)}"
}
Run Code Online (Sandbox Code Playgroud)

对于更直接的“if-elif-else”方法,您可以将 if 简写与其他简写一起嵌入以产生类似的效果。如果您的用例也在 for 循环中,您也可以这样做:

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

将适用于您将使用“${}”语法的任何情况


Pau*_*her 10

从 terraform 0.12 开始,您可以使用地图来伪造开关,例如

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

这样做的优点是,如果结果更复杂,您可以从地图返回对象/列表,而不是简单的字符串。

例如,我有一个集中命名模块,它根据资源类型等根据不同的规则组成名称。

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])
Run Code Online (Sandbox Code Playgroud)


小智 9

我花了几个小时来处理这个问题,试图创建数组来实现我的要求。根据 @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")))
Run Code Online (Sandbox Code Playgroud)


Est*_*cia 7

您可以尝试仅使用 amaplookup。例子:

/* 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)}"
}
Run Code Online (Sandbox Code Playgroud)

如果var.region是您部署当前集群的位置,并且其值为例如us-east-1,则查找将返回us-east-2为您应该部署副本的区域。

根据您的需要进行调整。