如何在 Terraform 中进行简单的字符串连接?
How do you do simple string concatenation in 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 中进行简单的字符串连接?
我不敢相信我在问如何将 2 个字符串连接在一起 XD
更新:
对于任何有类似问题的人,我暂时做了这个 可怕的 解决方法:
main_api_gw = "app.api.${var.env_name == "prod" ? "" : var.env_name}${var.env_name == "prod" ? "" : "."}mydomain.com"
尝试以下数据资源:
data "null_data_source" "api_gw_url" {
inputs = {
main_api_gw = "app.api${var.env_name == "prod" ? "." : ".${var.env_name}."}mydomain.com"
}
}
我知道这已经有人回答了,但我想分享我最喜欢的:
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
经过大量研究,它终于对我有用。我试图关注 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"]
}
}
所以要为一个简单的问题添加一个简单的答案:
- 将要连接成一对
""
的所有字符串括起来
- 引号内的引用变量
${var.name}
示例:var.foo
应与 bar
字符串连接并用破折号分隔
解决方案:"${var.foo}-bar"
对于 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
使用 Interpolation Syntax 版本 < 0.12
我一定是非常愚蠢,但我不知道如何在 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"
尝试以下数据资源:
data "null_data_source" "api_gw_url" {
inputs = {
main_api_gw = "app.api${var.env_name == "prod" ? "." : ".${var.env_name}."}mydomain.com"
}
}
我知道这已经有人回答了,但我想分享我最喜欢的:
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
经过大量研究,它终于对我有用。我试图关注 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"]
}
}
所以要为一个简单的问题添加一个简单的答案:
- 将要连接成一对
""
的所有字符串括起来
- 引号内的引用变量
${var.name}
示例:var.foo
应与 bar
字符串连接并用破折号分隔
解决方案:"${var.foo}-bar"
对于 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
使用 Interpolation Syntax 版本 < 0.12