在Terraform中如何进行简单的字符串拼接?

127

我一定是太蠢了,但我无法在Terraform中实现简单的字符串拼接。

我有以下数据null_data_source

data "null_data_source" "api_gw_url" {
    inputs = {
      main_api_gw = "app.api.${var.env_name == "prod" ? "" : var.env_name}mydomain.com"
    }
}

所以当env_name="prod"时,我想要输出app.api.mydomain.com,对于其他任何情况 - 比如说env_name="staging",我想要app.api.staging.mydomain.com
但是上面的代码会输出app.api.stagingmydomain.com<--注意staging后面缺少"."。
我尝试在env_name不是"prod"时连接".",但是Terraform出现了错误:
data "null_data_source" "api_gw_url" {
    inputs = {
      main_api_gw = "app.api.${var.env_name == "prod" ? "" : var.env_name + "."}mydomain.com"
    }
}

错误是__builtin_StringToInt: strconv.ParseInt: parsing ""

TF中的concat()函数似乎是用于列表而不是字符串。

因此如标题所述:您如何在Terraform中执行简单的字符串连接?

我简直不敢相信我正在问如何将2个字符串连接在一起XD

更新:

对于有类似问题的任何人,我暂时使用了这个可怕的解决方法:

main_api_gw = "app.api.${var.env_name == "prod" ? "" : var.env_name}${var.env_name == "prod" ? "" : "."}mydomain.com"


1
小提示,此内容适用于0.12版本之前的版本。 - Pixel
@Pixel 是的,对于版本大于0.12,请查看https://dev59.com/y1MI5IYBdhLWcg3wy-te#64452011。 - huskygrad
6个回答

142

我知道这个问题已经有答案了,但是我想分享一下我的最爱:

format("%s/%s",var.string,"string2")

真实世界的例子:

locals {
 documents_path = "${var.documents_path == "" ? format("%s/%s",path.module,"documents") : var.documents_path}" 
}

更多信息:
https://www.terraform.io/docs/configuration/functions/format.html


2
这个解决方案有什么优势,为什么比@Markus的答案中提到的使用${}更好呢? - Michał Wesołowski
格式比其他$""的标记更强大,它支持的不仅仅是字符串,并处理复杂的转换等。这就是为什么有人会说了解它更好,但在大多数情况下,我还是使用$符号。 - TheNano

98

为了回答一个简单问题,可以给出一个简单的答案:

  • 将你想要连接的所有字符串括在一对""
  • 在引号内使用${var.name}引用变量

例如:需要将var.foo与字符串bar连接,并用破折号分隔。

解决方法:"${var.foo}-bar"


67

请尝试以下数据资源:

data "null_data_source" "api_gw_url" {
    inputs = {
      main_api_gw = "app.api${var.env_name == "prod" ? "." : ".${var.env_name}."}mydomain.com"
    }
}

较新版本可能会对此语法发出警告。还请考虑使用字符串函数,请查看:https://dev59.com/y1MI5IYBdhLWcg3wy-te#64452011 - huskygrad
1
将一个点移动到表达式外以简化:"app.api.${var.env_name == "prod" ? "" : "${var.env_name}."}mydomain.com" - colm.anseo

50

对于 Terraform 0.12 及更高版本,您可以使用 join() 函数:

join(separator, list)

例子:

> join(", ", ["foo", "bar", "baz"])
foo, bar, baz
> join(", ", ["foo"])
foo
如果您只想简单地连接字符串而不使用分隔符,例如将“foo”和“bar”连接成“foobar”,则:
> join("", ["foo", "bar"])
foobar

参考: https://www.terraform.io/docs/configuration/functions/join.html

对于版本 < 0.12,请使用插值语法


1
我使用这种方法来处理多行字符串,以便于阅读性(和在git中进行良好的差异比较)将每个数组元素放在自己的一行上。您无法跨多行进行字符串插值,而且我更喜欢使用join()而不是使用字符串格式化的%s十几次。 - jpvantuyl

2

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接