基于环境的Terraform条件块

时间:2017-02-25 21:22:00

标签: if-statement conditional terraform

我正在考虑使用Terraform中的new conditionals基本上打开或关闭配置块,具体取决于环境。

这是我想要成为条件的块,例如,如果我有一个变量可以开启生产。

access_logs {
    bucket = "my-bucket"
    prefix = "${var.environment_name}-alb"
}

我认为我有条件检查环境的逻辑,但我不知道如何将上述配置粘贴到逻辑中。

"${var.environment_name == "production" ? 1 : 0 }"

是否可以通过access_logs变量打开和关闭environment_name块?如果无法做到这一点,是否有解决方法?

5 个答案:

答案 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 元素列表。