windows 如何使用Terraform将包含文件的本地完整目录复制到另一个本地目录?

aydmsdu9  于 2022-11-18  发布在  Windows
关注(0)|答案(1)|浏览(192)

我有一个包含文件的本地目录。我如何使用Terraform将包含对象的目录复制到另一个目录中?而且我每次应用模块时都需要这样做,而不仅仅是第一次。
我尝试使用provisioner "local-exec",但它不适合我,因为我将在Linux和Win上运行它,我不想每次都更改命令和解释器

e5nszbig

e5nszbig1#

Terraform不是为管理本地文件而设计的;它主要用于通过网络使用远程API,以便在运行之间结果可以在远程系统中持久保存。
但是,the hashicorp/local provider确实有一些资源类型会尝试将本地文件系统 * 当作 * 远程API来处理。它的文档中包含了一个关于这样做可能存在的限制的警告:
Terraform主要处理远程资源,这些资源能够在Terraform运行一次后仍然存在,因此本地资源有时会违反它的假设。这里的资源最好小心使用,因为依赖于本地状态会使相同的Terraform配置很难应用到许多不同的本地系统上,而本地资源可能不是普遍可用的。请参阅每个资源中的特定注解以获得更多信息。
如果您可以接受这种折衷,那么应该可以实现一个Terraform模块,该模块使用the local_file resource type声明目标文件来声明所描述的效果,但是提供程序没有用于阅读目录内容的数据源,因此对于 source 文件,在Terraform运行之前需要将文件集固定在磁盘上,以便可以使用the fileset function。(在Terraform执行任何其他操作之前,函数作为初始配置评估的一部分进行评估,因此在Terraform运行时,此函数无法对文件系统的更改做出React。)

variable "source_dir" {
  type = string
}

variable "destination_dir" {
  type = string
}

locals {
  source_files = fileset(var.source_dir, "**")
}

resource "local_file" "dest" {
  for_each = local.source_files

  filename       = "${var.source_dir}/${each.value}"
  content_base64 = filebase64("${var.destination_dir}/${each.value}")
}

它使用local_file声明每个目标文件都应该存在。
这里需要注意的是,filebase64函数会将给定文件的全部内容读入内存,然后Terraform会将该值复制到提供程序的content_base64参数中,作为对提供程序插件的请求的一部分。这意味着,只有当您知道要复制的所有文件都相对较小时,这种技术才可行。如果您有任何特别大的文件,那么您可能会遇到将文件加载到内存的RAM限制,或者将内容发送到hashicorp/local提供程序的提供程序插件协议消息大小限制。
如果有任何方法可以使用Terraform之外的软件来解决这部分问题,比如使用传统的配置管理工具,那么我建议你考虑这种方法。虽然这可能会起作用,但这不是Terraform的设计目的。

相关问题