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



我有一个存放文件的本地目录。如何使用Terraform将包含对象的目录复制到另一个目录?每次应用模块时我都需要这样做,而不仅仅是第一次。

我尝试使用provisioner "local-exec",但它不适合我,因为我将在Linux和Win上运行它,我不想每次都更改命令和解释器

Terraform不是为管理本地文件而设计的;它主要用于通过网络处理远程api,以便结果可以在两次运行之间保存在远程系统中。

但是,hashicorp/local提供程序确实有一些资源类型试图将本地文件系统当作远程API来处理。它的文档包含了对这样做可能的限制的警告:

Terraform主要处理远程资源,这些资源能够比Terraform运行的时间长,因此本地资源有时会违反它的假设。这里的资源最好谨慎使用,因为依赖于本地状态可能会使在许多不同的本地系统上应用相同的Terraform配置变得困难,而本地资源可能不是普遍可用的。有关更多信息,请参阅每个资源中的特定注释。

如果这种权衡对你来说是可以接受的,那么应该可以实现一个Terraform模块,它声明你使用local_file资源类型来声明目标文件所描述的效果,但是提供程序没有用于读取目录内容的数据源,因此对于文件,需要在Terraform运行之前将文件集固定在磁盘上,以便可以使用fileset函数。(函数作为初始配置评估的一部分进行评估,在Terraform采取任何其他操作之前,因此该函数不能对在Terraform运行时对文件系统所做的更改作出反应。)

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设计的目的。

最新更新