Terraform: хранить содержимое набора файлов в одной переменной - PullRequest
0 голосов
/ 18 февраля 2020

Это в TF V0.12, если это помогает. В каталоге у меня есть переменное число однострочных файлов.
Мне нужно как-то прочитать содержимое их всех, объединить их с новой строкой между и сохранить результат в одну переменную. (не массив строк) Я знаю, что могу получить список файлов для чтения, используя:

locals{
  my files=tolist(fileset("${var.file_path}", "**")) }

И если у меня был только один файл, я знаю, что могу прочитать содержимое, используя

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

Но мой мозг только что превратился в вату, как я могу читать несколько раз, я чувствую, что должен использовать счетчик и конкатенацию в нулевом ресурсе, но кажется, что логика не работает c вне. Это правильный путь или как мне это делать?

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

Мы можем разбить эту проблему на три этапа:

  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)
}

В качестве альтернативы, мы можем можно выполнить все эти шаги вместе в одном выражении:

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

Обратите внимание, что в вызове fileset я включил var.file_path в аргумент pattern, а не в path аргумент, потому что таким образом все пути к полученным файлам будут относиться к текущему рабочему каталогу, и поэтому мы можем просто передать их непосредственно в file без необходимости повторного добавления var.file_path туда.

(Разделение между path и pattern для fileset помогает справиться с такими ситуациями, как зеркалирование группы файлов в S3, где полезно, чтобы результирующие пути были относительно доллара et root, а не текущий рабочий каталог, но такого рода отображение здесь не важно, поскольку имена файлов вообще не появляются в результате.)

1 голос
/ 18 февраля 2020

Спасибо @mon, что напомнил мне, что я всегда должен KISS

Устранить сложность, с которой я закончил

resource "null_resource" "concatenate_my_files" {
  provisioner "local-exec" {
    working_dir = var.file_path
    command = <<EOF
cat * > my_temp_file
EOF
  }
}

Затем я могу прочитать это, как и раньше.

1 голос
/ 18 февраля 2020

Объединить локально с null_resource.

resource "null_resource" "concatenate_my_files" {
  provisioner "local-exec" {
    working_dir = "${var.file_path}"
    command = <<EOF
      cat "${local.my_files}" > "${var.concatenated_file_name}"
EOF
  }
}
...