You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Terraform将本地完整目录复制至另一本地目录(每次生效)

跨平台实现Terraform每次Apply都复制本地目录

解决方案:null_resource+自动系统适配

核心思路是靠null_resource的触发器强制每次apply都执行操作,同时利用Terraform内置的系统变量自动匹配Windows/Linux的命令与解释器,不用手动修改代码。

完整代码示例

# 定义路径变量
variable "source_dir" {
  type        = string
  description = "待复制的源目录路径"
}

variable "dest_dir" {
  type        = string
  description = "目标目录路径"
}

# 自动识别操作系统类型
locals {
  os_type = terraform.os.family
}

# 执行目录复制的核心资源
resource "null_resource" "dir_copy" {
  # 用timestamp()做触发器,每次apply都会生成新值,强制资源重新运行
  triggers = {
    always_execute = timestamp()
  }

  provisioner "local-exec" {
    # 根据系统自动切换复制命令
    command = local.os_type == "windows" ? 
      "xcopy /E /I /Y \"${var.source_dir}\" \"${var.dest_dir}\"" : 
      "cp -r \"${var.source_dir}\" \"${var.dest_dir}\""
    
    # 自动匹配对应终端解释器
    interpreter = local.os_type == "windows" ? ["cmd", "/C"] : ["/bin/sh", "-c"]
  }
}

关键细节说明

  • 强制重复执行:triggers中的timestamp()会在每次apply时生成新的时间戳,触发null_resource重新执行,完全满足"每次apply都复制"的需求。
  • 跨平台免配置:通过terraform.os.family自动识别系统(Windows返回windows,Linux/macOS返回linux/darwin),自动切换xcopy(Windows)和cp(类Unix)命令,同时匹配对应的终端解释器,无需手动修改代码。
  • 命令参数作用:
    • Windows的xcopy用/E复制所有子目录(包含空目录),/I自动创建不存在的目标目录,/Y覆盖文件时不弹出确认提示。
    • Linux的cp -r实现递归复制目录及所有内容。

使用方式

直接在模块中引入这段代码,传入source_dir和dest_dir两个路径参数即可,无需额外配置操作系统相关选项。

内容的提问来源于stack exchange,提问作者Evgol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:35:29