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

Terraform创建vSphere嵌套文件夹失败问题求助

解决Terraform创建vSphere嵌套文件夹时的父文件夹不存在错误

问题描述

执行terraform apply -var="vsphere_folder_path=iac/dev/test"创建嵌套vSphere文件夹时,Terraform计划显示会依次创建iac、iac/dev、iac/dev/test三个层级,但实际执行时子文件夹因父文件夹未创建完成报错,提示父文件夹不存在。

原代码

provider "vsphere" {
  vsphere_server       = var.vsphere_server
  user                 = var.vsphere_username
  password             = var.vsphere_password
  allow_unverified_ssl = var.vsphere_insecure
}
# split path from env
locals {
  folder_parts = split("/", var.vsphere_folder_path)
}

data "vsphere_datacenter" "dc" {
  name = var.vsphere_datacenter
}
# trying to use a slice with count
resource "vsphere_folder" "folders" {
  count = length(local.folder_parts)

  path = join("/", slice(local.folder_parts, 0, count.index + 1))
  type = "vm"
  datacenter_id = data.vsphere_datacenter.dc.id
}

错误输出

Terraform will perform the following actions:

  # module.vm-folder-path.vsphere_folder.folders[0] will be created
  + resource "vsphere_folder" "folders" {
      + datacenter_id = "datacenter-2"
      + id            = (known after apply)
      + path          = "iac"
      + type          = "vm"
    }
  # module.vm-folder-path.vsphere_folder.folders[1] will be created
  + resource "vsphere_folder" "folders" {
      + datacenter_id = "datacenter-2"
      + id            = (known after apply)
      + path          = "iac/dev"
      + type          = "vm"
    }

  # module.vm-folder-path.vsphere_folder.folders[2] will be created
  + resource "vsphere_folder" "folders" {
      + datacenter_id = "datacenter-2"
      + id            = (known after apply)
      + path          = "iac/dev/test"
      + type          = "vm"
    }

Plan: 3 to add, 0 to change, 0 to destroy.

module.vm-folder-path.vsphere_folder.folders[0]: Creating...
module.vm-folder-path.vsphere_folder.folders[2]: Creating...
module.vm-folder-path.vsphere_folder.folders[1]: Creating...
module.vm-folder-path.vsphere_folder.folders[0]: Creation complete after 0s [id=group-v193962]
╷
│ Error: error trying to determine parent targetFolder: folder '/HQ/vm/iac/dev' not found
│ 
│   with module.vm-folder-path.vsphere_folder.folders[2],
│   on .terraform/modules/vm-folder-path/main.tf line 18, in resource "vsphere_folder" "folders":
│   18: resource "vsphere_folder" "folders" {
│ 
╵
╷
│ Error: error trying to determine parent targetFolder: folder '/HQ/vm/iac' not found
│ 
│   with module.vm-folder-path.vsphere_folder.folders[1],
│   on .terraform/modules/vm-folder-path/main.tf line 18, in resource "vsphere_folder" "folders":
│   18: resource "vsphere_folder" "folders" {

问题根源

Terraform默认会并行创建同类型的资源实例,通过count生成的三个文件夹资源之间没有显式的依赖关系,导致子文件夹的创建请求在父文件夹完全创建完成前就发送给vSphere API,此时父文件夹尚未存在,因此报错。

解决方案

在文件夹资源中添加depends_on参数,建立层级依赖关系,确保每个子文件夹只有在其父文件夹创建完成后才开始创建。

修改后的代码

provider "vsphere" {
  vsphere_server       = var.vsphere_server
  user                 = var.vsphere_username
  password             = var.vsphere_password
  allow_unverified_ssl = var.vsphere_insecure
}
# split path from env
locals {
  folder_parts = split("/", var.vsphere_folder_path)
}

data "vsphere_datacenter" "dc" {
  name = var.vsphere_datacenter
}
# 建立层级依赖的文件夹创建逻辑
resource "vsphere_folder" "folders" {
  count = length(local.folder_parts)

  path = join("/", slice(local.folder_parts, 0, count.index + 1))
  type = "vm"
  datacenter_id = data.vsphere_datacenter.dc.id

  # 为每个子文件夹添加对前一个父文件夹的依赖
  depends_on = count.index > 0 ? [vsphere_folder.folders[count.index - 1]] : []
}

原理说明

  • 当count.index为0时(即第一个根文件夹iac),没有依赖项,直接创建。
  • 当count.index大于0时,当前文件夹依赖前一个索引对应的文件夹资源,Terraform会等待前一个文件夹创建完成后,再启动当前文件夹的创建流程,确保父文件夹存在。

修改后执行terraform apply,会看到资源按顺序创建:

module.vm-folder-path.vsphere_folder.folders[0]: Creating...
module.vm-folder-path.vsphere_folder.folders[0]: Creation complete after 0s [id=group-v193962]
module.vm-folder-path.vsphere_folder.folders[1]: Creating...
module.vm-folder-path.vsphere_folder.folders[1]: Creation complete after 0s [id=group-v193963]
module.vm-folder-path.vsphere_folder.folders[2]: Creating...
module.vm-folder-path.vsphere_folder.folders[2]: Creation complete after 0s [id=group-v193964]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:54:51