【问题标题】:How to instantiate contents of rendered template_file?如何实例化渲染模板文件的内容?
【发布时间】:2019-11-16 07:28:11
【问题描述】:

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

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 预处理器进行替换,但不“包含”文件。 有点令人沮丧。我希望 Terraform 实例化我渲染的模板文件的内容。我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

    • 好的,我已经阅读了这方面的文档,这很好。我认为它会运作良好。然后我就不再需要无语法的模板文档了,而且看起来这也会给我更少的代码。非常好。
    • 谢谢,我今天早上实施了你的建议(升级 terraform 之后),效果很好。
    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2017-03-01
    • 2014-12-12
    相关资源
    最近更新 更多