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

时间:2019-12-17 20:09:49

标签: terraform interpolation

  

join可以,但是我想保留双引号,所以给我

     

[ben,linda,john]

     

但是我想要这个

     

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

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

所以我有

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

并且我想将其传递给terrform中使用的变量

var.name

为什么畸形者不能照原样采取这种方式?

我收到一条错误消息,说该字符串是epxtected,到处都存储之后我找不到在线解决方案

我已经能够获得

[ 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

2 个答案:

答案 0 :(得分:1)

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

您显示的语法示例看起来像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编码相同,因此没有真正的理由去做上面显示的事情,但是我在这里展示了各个步骤作为示例,以便那些想要产生不同的列表序列化有一个起点。

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

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

答案 1 :(得分:0)

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

当列表有元素时...

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

也适用于空列表...

> join("", [])
""