如何将 Terraform 文件从一个本地目录复制到另一个本地目录

时间:2021-02-25 18:28:49

标签: terraform

我想将一个模块文件夹中的文件简单复制到另一个模块文件夹,但 terraform 似乎没有这种资源。我试图用 null_resource 做到这一点,但解释器通过执行失去了所有环境。 使用 local_file 它也不能正常工作。你能建议如何做到这一点吗?

试过这个,但“数据”源在应用之前搜索文件并且失败了:

data "local_file" "code" {
  filename = "${path.module}/code.zip"
  depends_on = [null_resource.build_package]
}

# copy package to module root directory
resource "local_file" "code" {
    content_base64  = data.local_file.code.content_base64
    filename        = "${path.root}/resources/code_elasticsearch_proxy.zip"
}

也试过了:

resource "null_resource" "code" {
  provisioner "local-exec" {
    command = "cp ./${path.module}/code.zip ./code_elasticsearch_proxy.zip"
    interpreter = ["bash"]
    environment = {
      PWD = path.root
    }
  }
}

但是这个丢失了所有环境,我无法获得文件的完整路径

1 个答案:

答案 0 :(得分:0)

在本地系统上管理文件不是 Terraform 的预期用例,因此我鼓励您考虑针对此问题的其他潜在解决方案,但由于 Terraform 是开放系统,您可以在其中为 编写提供程序任何原则上都有一种方法可以获得您想要的结果,尽管与其他选项相比它可能有一些缺点。

在考虑您的问题时我想到的解决方案是使用 the local_file resource type 中的 the hashicorp/local provider

terraform {
  required_providers {
    local = {
      source = "hashicorp/local"
    }
  }
}

resource "local_file" {
  content_base64 = filebase64("${path.module}/code.zip")
  filename       = "${path.cwd}/code_elasticsearch_proxy.zip"
}

我可以立即识别出这种方法的一个缺点是它会导致 Terraform 将该文件的全部内容加载到内存中,并将其作为字符串传递给提供者。如果文件很大,那么这可能会很慢,使用比您想要的更多的 RAM,它甚至可能达到 Terraform 插件机制的内部限制,该机制是为发送小数据属性而不是大文件的更典型用例而设计的内容。

您没有提到为什么在不同的位置创建此文件的副本很重要,但我强烈建议考虑其他方法,您可以将文件的原始位置传递给最终要访问的任何子系统阅读它,而不是创建副本。这两个文件位于您本地文件系统中的不同位置,因此希望使用它的系统应该能够直接从 ${path.module}/code.zip 读取,就像它能够从 ${path.cwd}/code_elasticsearch_proxy.zip 读取一样。