如何在 Terraform 中将列表转换为字符串?

How can I convert a list to a string in Terraform?

join works BUT i want to keep the double quotes join gives me this

[ben,linda,john]

BUT i want this

["ben", "linda", "john"]

这太疯狂了,花了 2 个多小时试图解决这个问题 我想将列表作为字符串变量传递 为什么 terraform 不能将我的列表作为字符串接收?为什么这么难?

所以我有

name = ["ben", "linda", "john"]

我想将其传递给 terrform

中使用的变量

var.name

为什么不能改变现状?

我收到错误消息说 epxtected a string,到处搜索后我无法在线找到解决方案

我已经能够得到

[ ben,linda,john ] 使用 join(",", var.name) 但我想要 ["ben", "linda", "john"]

$ terraform --version
Terraform v0.12.18
+ provider.aws v2.42.0
+ provider.template v2.1.2

从列表到字符串的转换始终需要明确决定结果的格式:哪个字符(如果有)将分隔各个项目,哪些定界符(如果有)将标记每个项目,哪些标记将是包含在开头和结尾(如果有)以将结果明确标记为列表。

您显示的语法示例看起来像 JSON。如果这是您的目标,那么最简单的答案是使用 jsonencode 将列表直接转换为 JSON 语法:

jsonencode(var.names)

此函数生成紧凑 JSON,因此结果如下:

["ben","linda","john"]

Terraform 为 JSON 提供了一个随时可用的功能,因为这是一个普遍的需求。如果您需要对上述决策进行更多控制,那么您需要使用更复杂的技术来向 Terraform 描述您的需求。例如,要生成一个字符串,其中每个输入字符串都包含在引号中,各项之间用逗号分隔,并且整个结果由 [] 标记分隔,需要三个步骤:

  • 转换列表以添加引号:[for s in var.names : format("%q", s)]
  • 使用 , 作为分隔符加入该结果:join(", ", [for s in var.names : format("%q", s)])
  • 添加前导和尾随标记:"[ ${join(",", [for s in var.names : format("%q", s)])} ]"

以上内容与列表的 JSON 编码做出相同的决定,因此没有真正的理由完全按照我上面显示的方式进行操作,但我在这里展示了各个步骤作为示例这样那些想要产生不同列表序列化的人就有了一个工作的起点。

例如,如果逗号后的 space 很重要,那么您可以将上面的第一个参数调整为 join 以包含 space:

"[ ${join(", ", [for s in var.names : format("%q", s)])} ]"

我想改进 jsonencode 的建议。相反,我使用 join 函数。

当列表有元素时...

> join("", ["join", "these", "strings"])
"jointhesestrings"

也适用于空列表...

> join("", [])
""