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
相关产品推荐
相关产品推荐

