Terraform:将一组文件的内容存储到单个变量中

Mar*_*ams 1 terraform hcl

这是 TF V0.12 中的内容(如果有帮助的话) 在一个目录中,我有数量可变的单行文件。
我需要以某种方式读取它们的内容,将它们与换行符连接起来,并将结果存储到单个变量中。(不是字符串数组)我知道我可以使用以下方法获取要读取的文件列表:

locals{
  my files=tolist(fileset("${var.file_path}", "**")) }
Run Code Online (Sandbox Code Playgroud)

如果我只有一个文件,我知道我可以使用以下方式读取内容

locals {
  file_value=file("${var.file_path}\\${local.my_files}") # if there was only a single file
}
Run Code Online (Sandbox Code Playgroud)

但我的大脑只是变成了棉絮,我如何才能进行多个读取,我觉得我应该在空资源中使用计数和连接,但似乎无法解决逻辑。这是正确的道路还是我应该怎么做?

Mar*_*ins 9

我们可以把这个问题分解为三个步骤:

  1. 枚举与所需模式匹配的文件名。
  2. 将每个文件的内容读入内存。
  3. 将所有文件内容连接在一起。

我们可以将上述内容重新表述为三个局部值表达式,每个表达式都建立在前一个表达式的基础上:

locals {
  filenames            = fileset(".", "${var.file_path}/**")
  file_contents        = { for fn in local.filenames : fn => file(fn) }
  file_contents_concat = join("\n", local.file_contents)
}
Run Code Online (Sandbox Code Playgroud)

或者,我们可以在一个表达式中一起完成所有这些步骤:

locals {
  file_contents_concat = join("\n", [
    for fn in fileset(".", "${var.file_path}/**") : file(fn)
  ])
}
Run Code Online (Sandbox Code Playgroud)

请注意,在fileset调用中我包含var.file_pathpattern参数中而不是参数中,path因为这样生成的文件路径都将相对于当前工作目录,因此我们可以直接将它们传递给而不file需要var.file_path在那里重新添加。

path(和patternfor之间的分隔fileset有助于解决诸如将一堆文件镜像到 S3 之类的情况,在这种情况下,使生成的路径相对于存储桶根而不是当前工作目录会很有帮助,但这种映射并不适用此处很重要,因为文件名根本不会出现在结果中。)