66

我一定是非常愚蠢,但我不知道如何在 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"

4

5 回答 5

78

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

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

于 2019-10-03T17:35:54.503 回答
49

试试下面的数据资源:

data "null_data_source" "api_gw_url" {
    inputs = {
      main_api_gw = "app.api${var.env_name == "prod" ? "." : ".${var.env_name}."}mydomain.com"
    }
}
于 2019-03-25T09:14:33.227 回答
37

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

  • 将要连接的所有字符串包含在一对中""
  • 引号内的引用变量${var.name}

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

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

于 2020-08-14T07:50:18.277 回答
15

对于 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使用插值语法

于 2020-10-20T19:23:19.487 回答
1

经过大量研究,它终于对我有用。我试图关注https://www.hashicorp.com/blog/terraform-0-12-preview-first-class-expressions/,但它没有用。似乎无法在表达式中处理字符串。

data "aws_vpc" "vpc" {
  filter {
    name   = "tag:Name"
    values = ["${var.old_cluster_fqdn == "" ? "${var.cluster_fqdn}" : "${var.old_cluster_fqdn}"}-vpc"]
    
  }
}
于 2020-07-28T09:59:03.213 回答