【问题标题】:How do you create scalar arrays/lists in Terraform?如何在 Terraform 中创建标量数组/列表?
【发布时间】:2021-11-12 21:12:08
【问题描述】:

myvar 应该是安全组列表。

variable "myvar" {
  default     = null
}

如果用户指定它,该列表将与默认安全组连接(从数据源中提取)。

如果未指定,则使用默认安全组。

这不起作用:

local {
    test = var.myvar != null ? concat(tolist(data.aws_security_group.data.id), var.myvar) : tolist(data.aws_security_group.data.id)
}

但这确实有效:

  aaa = var.myvar != null ? concat(["aaaa"], ["bbbbb","ccccccc"]) : ["aaaa"]

那么如何将字符串转换为标量数组/列表?这似乎是 Terraform 需要的,而 tolist() 不起作用。

【问题讨论】:

    标签: terraform


    【解决方案1】:

    根据给定的要求,我认为最直接的解决方案是将变量的默认值设置为 [] 并完全避免使用条件:

    variable "additional_security_group_ids" {
      type    = list(string)
      default = []
    }
    
    locals {
      security_group_ids = concat(
        [data.aws_security_group.default.id],
        var.additional_security_group_ids,
      )
    }
    

    连接一个空列表只会产生相同的列表,因此在上面未设置变量会导致local.security_group_ids 仅包含默认安全组 ID。

    将默认值设置为 null 在缺少该变量的值会完全禁用某些功能时很有用,或者如果您需要的逻辑无法通过默认值方便地表达,但我总是建议使用特定的默认值尽可能取值,因为结果对于未来的维护者来说往往更容易阅读和理解。

    【讨论】:

    • 这要简单得多,我没有意识到这是可能的。
    【解决方案2】:

    这是你要找的吗?

    value = var.myvar != null ? concat([data.aws_security_group.data.id], var.myvar) : [data.aws_security_group.data.id]
    

    【讨论】:

    • 嗯。这个对我有用。我实际上不确定你在寻找什么结果。 “标量数组/列表”有点矛盾。
    【解决方案3】:

    提出这个作为答案,但希望有一种不那么疯狂的方式

    local {
        test = var.myvar != null ? flatten(concat(tolist([data.aws_security_group.data.id]), [var.myvar])) : tolist([data.aws_security_group.data.id])
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2010-11-24
      • 1970-01-01
      • 2019-04-01
      相关资源
      最近更新 更多