【问题标题】:Terraform - Dynamic Inline Block using List Variable & ConditionalTerraform - 使用列表变量和条件的动态内联块
【发布时间】:2021-05-05 01:05:21
【问题描述】:

Ooookay... 这把我逼疯了。我已经使用 AWS CloudFormation 有一段时间了,最​​近我的任务是将我创建的东西“转换”(或调整)为 Terraform 变体,最终做同样的事情(原因)。

在大多数情况下,我相处得很好。但是......我已经来到了我的 AWS_Instance 部分,由于我对 Terraform 的了解,我提前害怕了,我完全被卡住了。我觉得我很接近,但我无法让它完全工作,所以关于以下内容;提前感谢您的任何帮助和建议!

问题:我有一个 AWS 实例要创建 - 根据用户的请求,它将附加 X 个 EBS 存储设备。 2、4 或无(假设)。在 AWS CF 中,我只是通过 IF 语句做一个条件; IF 2 然后创建 A 和 B; ELIF 4 然后创建 A、B、C 和 D,ELSE 什么也不做。简单的。在 Terraform 中,我发现很难做到同样的简单性。到目前为止,我有以下内容:

variable "test_list" {
  type = list
  default = [ "b", "c" ]
}

resource "aws_instance" "tf_instance" {
  #...#
  dynamic "ebs_block_device" {
    for_each = var.test_list
    content {
      device_name = "/dev/sd${ebs_block_device.value}"
      delete_on_termination = "true"
      volume_size = "2000"
      volume_type = "st1"
      encrypted = "${local.Instance_Encryption}"
    }
  }
}

这确实创建了一个带有 2 个附加磁盘(b 和 c)的实例,这是朝着正确方向迈出的一步,但问题是我找不到将条件添加到该 FOR_EACH 步骤的方法。我希望能够让它创建那些 2 或什么都不做。我尝试了以下方法,但它出错了:

for_each = local.Single-Node ? [ var.test_list_2 ] : [ null ]

可能我只是使用不正确(仅使用 Terraform 几天,所以我的某些理解肯定是错误的)。对此的任何帮助都非常感谢,因为我觉得我正在尝试做的是一件非常基本的事情[如果这什么都不做],但我已经在互联网上搜索无济于事!

【问题讨论】:

  • 你没有显示你的错误信息,但如果我不得不猜测出了什么问题,那可能是因为你输入了 list(null) 类型。您可能实际上想要一个空列表,即[]。如果没有,请分享您的错误信息和其他相关信息。

标签: conditional-statements terraform


【解决方案1】:

专注于您将问题构建为根据数字做出决定,我想我会通过为每个有效数字制作一个查找表来解决这个问题,如下所示:

variable "block_device_count" {
  type = number
}

locals {
  block_device_letters_by_count = {
    2 = ["a", "b"]
    4 = ["a", "b", "c", "d"]
  }
  block_device_letters = try(local.block_device_letters_by_count[var.block_device_count], [])
}

这是使用地图查找来实现与您之前的 IF、ELSEIF、ELSE 方法类似的结果。这里的try 充当“ELSE do nothing”部分:如果映射中没有匹配var.block_device_count 的元素,那么它将使用一个空列表作为后备结果。

现在local.block_device_letters 的形状适合与dynamic 块一起使用,因此我们可以按照您在示例中显示的类似方式使用它:

resource "aws_instance" "tf_instance" {
  #...#
  dynamic "ebs_block_device" {
    for_each = local.block_device_letters
    content {
      device_name = "/dev/sd${ebs_block_device.value}"
      delete_on_termination = "true"
      volume_size = "2000"
      volume_type = "st1"
      encrypted = "${local.Instance_Encryption}"
    }
  }
}

【讨论】:

  • 马丁·阿特金斯,你这个男人的传奇,这是你第二次用一个令人头疼的问题救了我。谢谢你,好先生!
猜你喜欢
  • 2021-08-11
  • 2021-11-28
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2017-10-09
  • 2021-05-03
相关资源
最近更新 更多