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

时间:2019-03-23 10:31:12

标签: 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"
    }
}

因此,当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中进行简单的字符串连接?

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

更新

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

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

5 个答案:

答案 0 :(得分:10)

因此为一个简单的问题添加一个简单的答案:

  • 将要连接的所有字符串括入一对docker-compose.yml
  • 引号内带有""的引用变量

示例:${var.name}应与var.foo字符串连接,并用短划线隔开

解决方案:bar

答案 1 :(得分:5)

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

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 :(得分:3)

尝试以下数据资源:

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

答案 3 :(得分:2)

对于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的版本使用Interpolation Syntax

答案 4 :(得分:1)

经过大量研究,终于为我工作了。我试图遵循https://www.hashicorp.com/blog/terraform-0-12-preview-first-class-expressions/,但没有成功。似乎无法在表达式中处理字符串。

doctTokens :447
doctTokens :902
[447, 508, 508, 503]