如何实例化渲染的template_file的内容?

时间:2019-11-15 21:30:24

标签: amazon-web-services terraform terraform-provider-aws

我在列表中使用了一个模板文件:

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所做的。

Terraform不会实例化模板文件的渲染内容。它只是将其保留为字符串并保留在内存中。有点像C预处理器执行替换,但不“包含”文件。 有点令人沮丧。我希望Terraform实例化渲染模板文件的内容。我该怎么做?

1 个答案:

答案 0 :(得分:1)

template_file数据源(连同templatefile函数已将其替换为Terraform 0.12)用于字符串模板化,而不用于模块化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