如何使用 if、else、elsif 语句创建 Terraform?
How to create a Terraform with if, else, elsif statement?
我正在设置一个 terraform 模块来创建一个极光集群。
我需要有一个跨区域复制选项,所以我需要确定与源区域相关的副本区域。
有什么方法可以在 terraform 中做一个有条件的多选项吗?
Terraform < 0.12 中没有 if / elseif / else 这样的东西
但是,您可以在 Terrafom Conditions
中使用经典布尔逻辑
这是使用 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)}"
}
您可以尝试只使用 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
,那么查找将 return us-east-2
作为您应该的区域正在部署您的副本。
根据您的需要进行调整。
从 terraform 0.12 开始,您可以使用地图伪造开关,例如
locals {
environments = {
prod = "east",
prod2 = "west2"
}
region = lookup(environment_region, lower(var.environment), "west")
}
这样做的好处是,如果结果更复杂,您可以 return objects/lists 来自地图,而不是简单的字符串。
比如我有一个集中命名模块,根据资源类型等不同的规则组成名称
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])
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)}"
}
}
将在您使用“${}”语法的任何情况下工作
我花了几个小时来处理这个问题,试图创建数组来实现我的要求。根据@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")))
我正在设置一个 terraform 模块来创建一个极光集群。
我需要有一个跨区域复制选项,所以我需要确定与源区域相关的副本区域。
有什么方法可以在 terraform 中做一个有条件的多选项吗?
Terraform < 0.12 中没有 if / elseif / else 这样的东西
但是,您可以在 Terrafom Conditions
中使用经典布尔逻辑这是使用 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)}"
}
您可以尝试只使用 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
,那么查找将 return us-east-2
作为您应该的区域正在部署您的副本。
根据您的需要进行调整。
从 terraform 0.12 开始,您可以使用地图伪造开关,例如
locals {
environments = {
prod = "east",
prod2 = "west2"
}
region = lookup(environment_region, lower(var.environment), "west")
}
这样做的好处是,如果结果更复杂,您可以 return objects/lists 来自地图,而不是简单的字符串。
比如我有一个集中命名模块,根据资源类型等不同的规则组成名称
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])
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)}"
}
}
将在您使用“${}”语法的任何情况下工作
我花了几个小时来处理这个问题,试图创建数组来实现我的要求。根据@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")))