我在列表中使用了一个模板文件:
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实例化渲染模板文件的内容。我该怎么做?
答案 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
。