【问题标题】:Dynamically create variables in template files based on list根据列表在模板文件中动态创建变量
【发布时间】:2023-01-13 11:45:18
【问题描述】:
我有一个通过模板文件创建的任务定义 json 文件。
像下面这样的东西:
data "template_file" "task_definition" {
templatefile = file("${path.module}/templates/task-definition.json")
vars {
environment = var.environment
}
在 json 文件(又名任务定义)中,我有一些可以是列表的变量。但是,该应用程序希望它们被拆分。像下面这样的东西:
{
"name": "MyEnvironmentVariable:0",
"value": "123"
},
{
"name": "MyEnvironmentVariable:1",
"value": "456"
},
在生产环境中,可能有 10 个(即一直到 MyEnvironmentVariable:10),但在某些测试环境中可能有 2 个甚至 0 个。
我该如何处理那个用例?
【问题讨论】:
标签:
amazon-web-services
terraform
terraform-provider-aws
【解决方案1】:
您的问题中缺少一些细节,所以我做了一些假设。
首先,听起来您的“环境”输入变量是字符串列表的映射:
variable "environment" {
type = map(list(string))
}
您需要在此处生成的 JSON 文件需要将其展平为单级列表,同时附加索引以避免多个同名值之间发生冲突。
下面的表达式应该得到你需要的数据结构:
locals {
environment_flat = tolist(flatten([
for name, values in var.environment : [
for i, value in values : {
name = length(values) > 1 ? "${name}:${i}" : name
value = value
}
]
]))
}
您可以使用 local.environment_flat 在模块的其他地方访问此数据结构。
来自 hashicorp/template 提供程序的 template_file 数据源自 2019 年以来已过时,因此您不应将其用作任何现代 Terraform 模块的一部分。
如果你想生成 JSON 那么我建议使用 the jsonencode function。
如果您的 JSON 数据结构足够复杂,需要在单独的文件中编写生成它的表达式,那么您可以使用 the templatefile function 作为 template_file 数据源的现代替代品。如果选择此选项,请参考Generating JSON or YAML from a Template 了解如何在外部模板文件中编写jsonencode 调用,从而避免通过字符串连接生成 JSON。