如何实例化呈现template_file的内容?

How to instantiate contents of rendered template_file?

我有一个用于列表的模板文件:

variable "users" {
  type = "list"
  default = [
    "blackwidow",
    "hulk",
    "marvel",
  ]
}

// This will loop through the users list above and render out code for
// each item in the list.
data "template_file" "init" {
  template = file("user_template.tpl")
  count = length(var.users)
  vars = {
    username = var.users[count.index]
    bucketid = aws_s3_bucket.myFTP_Bucket.id
  }
}

模板文件有多个aws资源,如
- "aws_transfer_user"
- "aws_s3_bucket_object"
- "aws_transfer_ssh_key"
等等...事实上,它可以拥有更多的东西。它也有一些地形变量。

此数据模板非常适合呈现模板文件的内容,替换我的用户名。

但是这就是 terraform 所做的一切。

Terraform 不会实例化模板文件的渲染内容。它只是将它作为一个字符串保存在内存中。有点像 C 预处理器进行替换,但不 'including' 文件。 有点令人沮丧。我希望 Terraform 实例化我呈现的模板文件的内容。我该怎么做?

template_file 数据源(连同已在 Terraform 0.12 中替换它的 templatefile 函数)用于字符串模板,而不是用于模块化 Terraform 配置。

要为集合中的每个项目生成一组不同的资源实例,我们使用 resource for_each:

variable "users" {
  type = set(string)
  default = [
    "blackwidow",
    "hulk",
    "marvel",
  ]
}

resource "aws_transfer_user" "example" {
  for_each = var.users

  # ...
}

resource "aws_transfer_user" "example" {
  for_each = var.users

  # ...
}

resource "aws_s3_bucket_object" "example" {
  for_each = var.users

  # ...
}

resource "aws_transfer_ssh_key" "example" {
  for_each = aws_transfer_user.example

  # ...
}

在每个资源块中,您可以使用 each.key 来引用每个用户名。在resource "aws_transfer_ssh_key" "example" 块内部,因为我使用了aws_transfer_user.example 作为重复表达式,所以您还可以使用each.value 来访问对应的aws_transfer_user 对象的属性。 for_each 表达式还用于告诉 Terraform aws_transfer_ssh_key.example 取决于 aws_transfer_user.example.