Terraform中如何用count.index替换硬编码值生成模板文件?
解决Terraform 0.11中引用count索引的template_file渲染内容问题
在Terraform 0.11版本中,当资源通过count参数创建多个实例时,你需要通过属性列表索引或者element函数来引用对应实例的属性。针对你的场景,这里有两种可行的修改方式:
方法1:直接使用列表索引
Terraform会为带count的资源生成属性列表(格式为resource_type.resource_name.*.attribute),你可以通过count.index直接定位到对应实例的渲染内容:
resource "local_file" "foo" { count = "${length(var.files)}" content = "${data.template_file.tenant_repo_multi.*.rendered[count.index]}" filename = "${element(var.files, count.index)}" } data "template_file" "tenant_repo_multi" { count = "${length(var.files)}" template = "${file("templates/${element(var.files, count.index)}")}" } variable "files" { type = "list" default = ["filebeat-config_filebeat.yml", ...] }
方法2:使用element函数(更兼容复杂场景)
如果需要处理索引越界的情况(虽然你的场景里count长度完全匹配,不会出现),可以用element函数来安全获取对应位置的元素:
resource "local_file" "foo" { count = "${length(var.files)}" content = "${element(data.template_file.tenant_repo_multi.*.rendered, count.index)}" filename = "${element(var.files, count.index)}" } # data和variable部分保持不变 data "template_file" "tenant_repo_multi" { count = "${length(var.files)}" template = "${file("templates/${element(var.files, count.index)}")}" } variable "files" { type = "list" default = ["filebeat-config_filebeat.yml", ...] }
关键说明
- 当
data.template_file.tenant_repo_multi设置了count后,它的rendered属性会自动变成一个列表,包含所有实例的渲染结果。 - 两种方式都能让
local_file的每个实例对应到同索引的template_file渲染内容,完美匹配你生成大量文件的需求。
内容的提问来源于stack exchange,提问作者user2062360
相关产品推荐
相关产品推荐

