Как вы делаете простую конкатенацию строк в 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 ""
concat()
Функция в TF, кажется, для списков, а не строк.
Так как заголовок говорит: Как вы делаете простую конкатенацию строк в Terraform?
Я не могу поверить, я спрашиваю, как соединить 2 строки вместе XD
Обновить:
Для тех, у кого есть подобная проблема, я сделал этот ужасный обходной путь в настоящее время:
main_api_gw = "app.api.${var.env_name == "prod" ? "" : var.env_name}${var.env_name == "prod" ? "" : "."}mydomain.com"
6 ответов
Попробуйте ниже ресурс данных:
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
Итак, чтобы добавить простой ответ на простой вопрос:
- заключите все строки, которые вы хотите объединить, в одну пару
""
- ссылочные переменные внутри кавычек с
${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
Используйте синтаксис интерполяции для версий < 0.12
Вот простой пример:
output "s3_static_website_endpoint" {
value = "http://${aws_s3_bucket.bucket_tf.website_endpoint}"
}
См. документы Terraform Interpolation: https://developer.hashicorp.com/terraform/language/expressions/strings#string-templates .
После долгих исследований это наконец сработало для меня. Я пытался следовать 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"]
}
}