Есть ли способ определить несколько исходных_файлов для провайдера архивов Terraform? - PullRequest
0 голосов
/ 06 июля 2019

Я использую Terraform archive_file провайдера для упаковки нескольких файлов в zip-файл.Он отлично работает, когда я определяю архив следующим образом:

data "archive_file" "archive" {
  type        = "zip"
  output_path = "./${var.name}.zip"
  source_dir  = "${var.source_dir}"
}

Однако я не хочу, чтобы архив содержал все файлы в var.source_dir, я хочу только их подмножество.Я заметил, что у провайдера archive_file есть атрибут source_file, поэтому я надеялся, что смогу предоставить список этих файлов и упаковать их в архив следующим образом:

locals {
  source_files = ["${var.source_dir}/foo.txt", "${var.source_dir}/bar.txt"]
}

data "archive_file" "archive" {
  type        = "zip"
  output_path = "./${var.name}.zip"
  count       = "2"
  source_file = "${local.source_files[count.index]}"
}

, но это не работает, архивсоздается для каждого файла, определенного в local.source-files, следовательно, у меня есть сценарий «последних побед», когда создаваемый архивный файл содержит только bar.txt.

Я пробовал это:

locals {
  source_files = ["${var.source_dir}/main.py", "${var.source_dir}/requirements.txt"]
}

data "archive_file" "archive" {
  type        = "zip"
  output_path = "./${var.name}.zip"
  source_file = "${local.source_files}"
}

но неудивительно, что произошел сбой:

data.archive_file.archive: source_file должен быть одним значением, а не списком

Есть ли способ достичь того, что япосле того, как здесь, т.е. передать список файлов провайдеру archive_file и сделать так, чтобы он упаковал их все в файл архива?

1 Ответ

1 голос
/ 08 июля 2019

---- Спасибо jamiet, я изменил как твой комментарий ----

  1. копировать файлы в временный каталог и архивировать их
locals {
  source_files = ["${var.source_dir}/main.py", "${var.source_dir}/requirements.txt"]
}

data "template_file" "t_file" {
  count = "${length(local.source_files)}"

  template = "${file(element(local.source_files, count.index))}"
}

resource "local_file" "to_temp_dir" {
  count    = "${length(local.source_files)}"
  filename = "${path.module}/temp/${basename(element(local.source_files, count.index))}"
  content  = "${element(data.template_file.t_file.*.rendered, count.index)}"
}

data "archive_file" "archive" {
  type        = "zip"
  output_path = "${path.module}/${var.name}.zip"
  source_dir  = "${path.module}/temp"

  depends_on = [
    "local_file.to_temp_dir",
  ]
}
  1. использовать источник архива_файла
locals {
  source_files = ["${var.source_dir}/main.py", "${var.source_dir}/requirements.txt"]
}

data "template_file" "t_file" {
  count = "${length(local.source_files)}"

  template = "${file(element(local.source_files, count.index))}"
}


data "archive_file" "archive" {
  type        = "zip"
  output_path = "./${var.name}.zip"

  source {
    filename = "${basename(local.source_files[0])}"
    content  = "${data.template_file.t_file.0.rendered}"
  }

  source {
    filename = "${basename(local.source_files[1])}"
    content  = "${data.template_file.t_file.1.rendered}"
  }
}
  1. создайте сценарий оболочки и вызовите его, используя внешний ресурс данных.
locals {
  source_files = ["${var.source_dir}/main.py", "${var.source_dir}/requirements.txt"]
}

data "template_file" "zip_sh" {
  template = <<EOF
#!/bin/bash
zip $* %1>/dev/null %2>/dev/null
echo '{"result":"success"}'
EOF
}

resource "local_file" "zip_sh" {
  filename = "${path.module}/zip.sh"
  content  = "${data.template_file.zip_sh.rendered}"
}

data "external" "zip_sh" {
  program = ["${local_file.zip_sh.filename}", "${var.name}", "${join(" ", local.source_files)}"]

  depends_on = [
    "data.template_file.zip_sh",
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...