如何在 Terraform 中进行简单的字符串连接?
Posted
技术标签:
【中文标题】如何在 Terraform 中进行简单的字符串连接?【英文标题】:How do you do simple string concatenation in Terraform? 【发布时间】:2019-08-14 05:13:21 【问题描述】:我一定是非常愚蠢,但我不知道如何在 Terraform 中进行简单的字符串连接。
我有以下数据null_data_source
:
data "null_data_source" "api_gw_url"
inputs =
main_api_gw = "app.api.$var.env_name == "prod" ? "" : var.env_namemydomain.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()
函数似乎用于列表而不是字符串。
正如标题所说:
我不敢相信我在问如何将 2 个字符串连接在一起 XD
更新:
对于任何有类似问题的人,我暂时做了这个可怕的解决方法:
main_api_gw = "app.api.$var.env_name == "prod" ? "" : var.env_name$var.env_name == "prod" ? "" : "."mydomain.com"
【问题讨论】:
小通知,0.12之前的版本都是这样 @Pixel 是的,对于 > 0.12 的版本,请查看 ***.com/a/64452011/5567066 【参考方案1】:我知道这已经回答了,但我想分享我最喜欢的:
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】:试试下面的数据资源:
data "null_data_source" "api_gw_url"
inputs =
main_api_gw = "app.api$var.env_name == "prod" ? "." : ".$var.env_name."mydomain.com"
【讨论】:
谢谢!我没有考虑嵌套$
!
较新的版本可能会收到此语法的警告。也可以考虑使用字符串函数,请查看:***.com/a/64452011/5567066【参考方案3】:
所以要为一个简单的问题添加一个简单的答案:
将所有要连接的字符串包含在一对""
中
用$var.name
引用引号内的变量
示例:var.foo
应与 bar
字符串连接并用破折号分隔
解决方案:"$var.foo-bar"
【讨论】:
【参考方案4】:对于 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
【讨论】:
【参考方案5】:经过大量研究,它终于对我有用。我试图关注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"]
【讨论】:
以上是关于如何在 Terraform 中进行简单的字符串连接?的主要内容,如果未能解决你的问题,请参考以下文章
Terraform 将 Cosmos 数据库连接字符串传递给 KeyVault
如何使用 terraform 连接不同 VPC 中的副本 Postgres RDS 及其源?
如何编写 terraform 代码来为过多的数据库连接创建 aws_cloudwatch_metric_alarm?