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

ube*_*ebu 8 interpolation terraform

join 有效但我想保留双引号连接给我这个

[ben,linda,john]

但我想要这个

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

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

所以我有

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

我想将它传递给 terrform 中使用的变量

var.name

为什么 terrform 不能接受这个?

我收到错误消息,说 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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ins 29

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

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

jsonencode(var.names)
Run Code Online (Sandbox Code Playgroud)

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

["ben","linda","john"]
Run Code Online (Sandbox Code Playgroud)

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 编码相同的决定,因此没有真正的理由完全按照我上面显示的方式进行,但我将此处显示的各个步骤作为示例,以便那些想要生成不同列表序列化有一个工作起点。

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

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

  • 这也是一个数组而不是 json.. `["a", "b", "c"]` (3认同)
  • 完美的作品!使用了这个 `"[${join(", ", [for s in var.names : format("%q", s)])}]"`..谢谢! (2认同)
  • 如果您按照 @ydaetskcor 的建议共享了现有的 Terraform 配置,我很乐意向您展示将其放置在现有 Terraform 配置中的位置,但希望这已经足够了。 (2认同)