如何实现Terraform中NSX-T Segment创建后自动导入VRA Fabric网络?
解决Terraform自动导入vRA Fabric Network的问题
你遇到的问题核心是Terraform的import块需要在计划阶段就确定导入ID,但NSX-T Segment的ID要等到应用阶段才会生成,所以直接用import块绑定动态ID是行不通的。下面给你两种可行的自动化方案:
方案一:分阶段自动化脚本(推荐)
通过分两次执行Terraform,先创建NSX-T Segment,再批量导入vRA资源,最后同步状态。
1. 新增输出变量
在你的Terraform代码里添加一个输出变量,用来导出所有Segment的标识键和对应ID:
output "overlay_segment_details" { value = { for seg_key, seg in nsxt_policy_segment.overlay_segment : seg_key => { id = seg.id } } description = "导出所有Overlay Segment的键和对应的ID" }
2. 编写自动化脚本
写一个shell脚本(比如import_vra_networks.sh),自动完成分阶段操作:
#!/bin/bash # 第一步:仅创建NSX-T Segment资源 echo "正在创建NSX-T Overlay Segments..." terraform apply -target=nsxt_policy_segment.overlay_segment -auto-approve # 第二步:批量导入vRA Fabric Network资源 echo "正在导入vRA Fabric Network资源..." terraform output -json overlay_segment_details | jq -r '.[] | "\(.key) \(.id)"' | while read seg_key seg_id; do terraform import "vra_fabric_network_vsphere.network[\"$seg_key\"]" "$seg_id" done # 第三步:同步Terraform状态,确保配置与实际资源一致 echo "正在同步Terraform状态..." terraform apply -auto-approve
3. 对齐vRA资源定义
确保你的vra_fabric_network_vsphere用for_each和NSX-T Segment的for_each完全对齐,保证每个Segment对应一个vRA网络:
resource "vra_fabric_network_vsphere" "network" { for_each = nsxt_policy_segment.overlay_segment # 根据需求填充其他必填属性 nsx_id = each.value.id name = each.value.display_name description = "自动导入的Overlay Segment: ${each.value.display_name}" # ...其他参数 }
方案二:用null_resource触发导入(不推荐,需谨慎)
通过在NSX-T Segment创建后,用null_resource的local-exec provisioner执行导入命令,但这种方式容易引发状态不一致问题,仅适合临时场景:
resource "null_resource" "import_vra_networks" { depends_on = [nsxt_policy_segment.overlay_segment] for_each = nsxt_policy_segment.overlay_segment provisioner "local-exec" { command = "terraform import \"vra_fabric_network_vsphere.network[\\\"${each.key}\\\"]\" ${each.value.id}" } }
⚠️ 注意:该方案需要确保Terraform状态文件有足够写入权限,且执行顺序易出问题,优先推荐方案一。
内容的提问来源于stack exchange,提问作者Mario Stoilov
相关产品推荐
相关产品推荐

