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

For*_*ero 9 terraform

我一定很笨,但是我不知道如何在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"
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当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"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

concat()TF中的功能似乎是针对列表而不是字符串。

如标题所示:如何在Terraform中进行简单的字符串连接?

我不敢问我要如何将2个字符串连在一起XD

更新:

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

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

小智 61

我知道这已经有人回答了,但我想分享我最喜欢的:

format("%s/%s",var.string,"string2")
Run Code Online (Sandbox Code Playgroud)

现实世界的例子:

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

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

  • 这是最好的答案 (2认同)
  • 为什么这个解决方案比 @Markus 答案中提到的使用 ${} 更好? (2认同)

Mar*_*kus 23

所以要为一个简单的问题添加一个简单的答案:

  • 将所有要连接的字符串括起来 ""
  • 引号内的引用变量 ${var.name}

示例:var.foo应与bar字符串连接并以破折号分隔

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


San*_*ket 9

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

join(separator, list)
Run Code Online (Sandbox Code Playgroud)

例子:

> join(", ", ["foo", "bar", "baz"])
foo, bar, baz
> join(", ", ["foo"])
foo
Run Code Online (Sandbox Code Playgroud)

如果您只想在没有分隔符的情况下进行连接,例如 "foo"+"bar" = "foobar",那么:

> join("", ["foo", "bar"])
foobar
Run Code Online (Sandbox Code Playgroud)

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

对版本 < 0.12使用插值语法


sar*_*tty 7

Try Below data resource :

data "null_data_source" "api_gw_url" {
    inputs = {
      main_api_gw = "app.api${var.env_name == "prod" ? "." : ".${var.env_name}."}mydomain.com"
    }
}
Run Code Online (Sandbox Code Playgroud)