使用terraform,我希望引用文件列表的内容(最终,我想使用archive_file提供程序将其压缩,但是在本篇文章中这并不重要)。这些文件都位于同一目录中,所以我有两个变量:
variable "source_root_dir" {
type = "string"
description = "Directory containing all the files"
}
variable "source_files" {
type = "list"
description = "List of files to be added to the cloud function. Locations are relative to source_root_dir"
}
我想使用模板数据提供程序来引用文件的内容。鉴于source_files
中文件的数量可以变化,我需要使用count
对所有文件执行相同的操作。
由于https://stackoverflow.com/a/43195932/201657提供的信息,我知道我可以像这样引用单个文件的内容:
provider "template" {
version = "1.0.0"
}
variable "source_root_dir" {
type = "string"
}
variable "source_file" {
type = "string"
}
data "template_file" "t_file" {
template = "${file("${var.source_root_dir}/${var.source_file}")}"
}
output "myoutput" {
value = "${data.template_file.t_file.rendered}"
}
注意,其中包含嵌套的字符串插值。如果我运行:
terraform init && terraform apply -var source_file="foo" -var source_root_dir="./mydir"
成功!
现在,我想将嵌套的字符串插值语法与我的count
结合使用。因此,我的Terraform项目现在看起来像这样:
provider "template" {
version = "1.0.0"
}
variable "source_root_dir" {
type = "string"
description = "Directory containing all the files"
}
variable "source_files" {
type = "list"
description = "List of files to be added to the cloud function. Locations are relative to source_root_dir"
}
data "template_file" "t_file" {
count = "${length(var.source_files)}"
template = "${file("${"${var.source_root_dir}"/"${element("${var.source_files}", count.index)}"}")}"
}
output "myoutput" {
value = "${data.template_file.t_file.*.rendered}"
}
是的,它看起来很复杂,但是从语法上讲,它是正确的(至少我认为是这样)。但是,如果我运行init并应用:terraform init && terraform apply -var source_files='["foo", "bar"]' -var source_root_dir='mydir'
我收到错误消息:
错误:data.template_file.t_file:发生2个错误:
* data.template_file.t_file [0]:__builtin_StringToInt:strconv.ParseInt:解析“ mydir”:语法无效:
$ {file(“ $ {” $ {var.source_root_dir}“ /” $ {element(“ $ {var.source_files}”,count.index)}“}”)}
* data.template_file.t_file 1:__builtin_StringToInt:strconv.ParseInt:解析“ mydir”:无效语法,位于:
$ {file(“ $ {” $ {var.source_root_dir}“ /” $ {element(“ $ {var.source_files}”,count.index)}“}”)}
我最好的猜测是它将/
解释为除法运算,因此尝试将source_root_dir
中的值 mydir 解析为一个整数。
我已经玩了很多年了,无法弄清楚。有人可以弄清楚如何将嵌套字符串插值与count
一起使用,以便使用模板提供程序来引用多个文件的内容吗?
答案 0 :(得分:0)
好的,我想我明白了。 formatlist
进行救援
provider "template" {
version = "1.0.0"
}
variable "source_root_dir" {
type = "string"
description = "Directory containing all the files"
}
variable "source_files" {
type = "list"
description = "List of files to be added to the cloud function. Locations are relative to source_root_dir"
}
locals {
fully_qualified_source_files = "${formatlist("%s/%s", var.source_root_dir, var.source_files)}"
}
data "template_file" "t_file" {
count = "${length(var.source_files)}"
template = "${file(element("${local.fully_qualified_source_files}", count.index))}"
}
output "myoutput" {
value = "${data.template_file.t_file.*.rendered}"
}
应用时:
terraform init && terraform apply -var source_files='["foo", "bar"]' -var source_root_dir='mydir'
输出:
申请完成!资源:添加了0个,更改了0个,销毁了0个。
输出:
myoutput = [ 这是foo
的内容 ,
这是酒吧的内容]