带计数的地形嵌套插值

时间:2019-07-08 21:50:43

标签: terraform

使用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"

当然是在创建文件mydir / foo 之后,这是输出: enter image description here

成功!

现在,我想将嵌套的字符串插值语法与我的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)}“}”)}

enter image description here

我最好的猜测是它将/解释为除法运算,因此尝试将source_root_dir中的值 mydir 解析为一个整数。

我已经玩了很多年了,无法弄清楚。有人可以弄清楚如何将嵌套字符串插值与count一起使用,以便使用模板提供程序来引用多个文件的内容吗?

1 个答案:

答案 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
的内容   ,
      这是酒吧的内容

     

]

enter image description here