我正在考虑使用Terraform中的new conditionals基本上打开或关闭配置块,具体取决于环境。
这是我想要成为条件的块,例如,如果我有一个变量可以开启生产。
access_logs {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
我认为我有条件检查环境的逻辑,但我不知道如何将上述配置粘贴到逻辑中。
"${var.environment_name == "production" ? 1 : 0 }"
是否可以通过access_logs
变量打开和关闭environment_name
块?如果无法做到这一点,是否有解决方法?
答案 0 :(得分:12)
在当前的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 }"
}
另见:
答案 1 :(得分:8)
扩展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"
}
}
您可以在此处阅读有关动态块的更多信息:https://www.terraform.io/docs/configuration/expressions.html#dynamic-blocks
答案 2 :(得分:1)
terraform中的条件目前仅用于确定一个值,而不是用作包裹块的if
语句。
您还可以使用条件来确定基于某种逻辑的值。
https://www.terraform.io/docs/configuration/interpolation.html#conditionals
答案 3 :(得分:1)
使用TF 0.12及更高版本实现此目的的一种方法是使用动态块:
dynamic "access_logs" {
for_each = var.environment_name == "production" ? [var.environment_name] : []
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
这将创建一个或零个access_logs块,具体取决于var.environment_name的值。
答案 4 :(得分:1)
扩展Juho Rutila的答案;我喜欢在此用例中使用range
函数:
dynamic "access_logs" {
for_each = range(var.environment_name == "production" ? 1 : 0)
contents {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
}
range(n)
生成一个 n 元素列表。