如何在terraform中创建标量数组/列表?

如何在terraform中创建标量数组/列表?,terraform,Terraform,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) }

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()不起作用了

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

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

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

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

这就是你要找的吗

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

这就是你要找的吗

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

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

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\u group\u id
仅包含默认的安全组id


当缺少某个变量的值会完全禁用某些功能时,或者如果无法通过默认值方便地表示所需的逻辑,则将默认值设置为
null
非常有用,但是我总是建议在可能的情况下使用特定的默认值,因为结果对于未来的维护人员来说更容易阅读和理解。

基于给定的要求,我认为最简单的解决方案是将变量的默认值设置为
[]
并且完全不需要条件:

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\u group\u id
仅包含默认的安全组id


当缺少某个变量的值会完全禁用某些功能时,或者如果无法通过默认值方便地表示所需的逻辑,则将默认值设置为
null
非常有用,但我总是建议在可能的情况下使用特定的默认值,因为结果对于未来的维护人员来说更容易阅读和理解。

。它对我有用。我真的不知道你想要什么结果。“标量数组/列表”有点矛盾。嗯。它对我很有效。实际上我不确定你在寻找什么结果。“标量数组/列表”有点矛盾。简单得多。我没有意识到这是可能的。简单得多。我没有意识到这是可能的。