jmr*_*cha 20 if-statement conditional-statements terraform
我正在考虑在Terraform 中使用新的条件基本上打开或关闭配置块取决于evnironment.
这是我想要成为条件的块,例如,我有一个变量可以打开生产.
access_logs {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
Run Code Online (Sandbox Code Playgroud)
我认为我有条件检查环境的逻辑,但我不知道如何将上述配置粘贴到逻辑中.
"${var.environment_name == "production" ? 1 : 0 }"
Run Code Online (Sandbox Code Playgroud)
是否可以access_logs通过environment_name变量打开和关闭块?如果无法做到这一点,是否有解决方法?
min*_*oyo 16
在当前的terraform中,if语句只是一个值,不能用于块.
在这种情况下有一种解决方法.您可以将块的enabled属性设置access_log为false.请注意,这不是一般解决方案,但只能与access_log块一起使用.
access_logs {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
enabled = "${var.environment_name == "production" ? true : false }"
}
Run Code Online (Sandbox Code Playgroud)
也可以看看:
Juh*_*ila 12
从TF 0.12开始,实现此目的的一种方法是使用动态块:
dynamic "access_logs" {
for_each = var.environment_name == "production" ? [var.environment_name] : []
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个或零个access_logs块,具体取决于var.environment_name的值。
扩展Juho Rutila的答案,因为它太多了,无法评论。
使用来自v0.12的动态块可以做到这一点,但是我发现必须将这些属性包含在嵌套content块中。该for_each语句也有些棘手,所以我发现将其提取到本地以提高重要内容的可读性是明智的:
locals {
isProd = var.environment_name == "production" ? [1] : []
// Not necessary, but just illustrating that the reverse is possible
isNotProd = var.environment_name == "production" ? [] : [1]
}
dynamic "access_logs" {
for_each = local.isProd
content {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关动态块的更多信息:https : //www.terraform.io/docs/configuration/expressions.html#dynamic-blocks