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

Terraform通过substr匹配VM名称获取OU路径失败求助

修复Terraform VM名称匹配OU路径的条件判断问题

问题根源

你的代码有两个关键问题导致条件始终不匹配:

  1. 错误依赖固定长度子串:用substr取前4位判断前缀,若VM名称格式变动(比如前缀长度变化)就会失效,且旧版Terraform的嵌套插值语法${"${var.vm_name}"}可能引发解析异常。
  2. 使用过时的插值语法:Terraform 0.12+支持直接引用变量,无需多层嵌套${}。

修复代码(最简版)

改用startswith函数直接判断前缀,语法更简洁可靠:

variable "vm_name" {
  default = "VMR1001"
}

locals {
  vmou = startswith(var.vm_name, "VMR1") ? "domou1" : 
         startswith(var.vm_name, "VMR2") ? "domou2" : 
         "domou3"
}

进阶优化(可扩展性更强)

如果后续要新增更多前缀与OU的映射,用Map存储规则更易维护:

variable "vm_name" {
  default = "VMR1001"
}

locals {
  # 定义前缀到OU的映射表
  vm_ou_mapping = {
    "VMR1" = "domou1"
    "VMR2" = "domou2"
  }

  # 自动匹配前缀,无匹配时用默认OU
  vmou = lookup(
    local.vm_ou_mapping,
    [for prefix in keys(local.vm_ou_mapping) : prefix if startswith(var.vm_name, prefix)][0],
    "domou3"
  )
}

验证方式

执行terraform console测试不同场景:

# 测试VMR1前缀
> local.vmou
"domou1"

# 切换到VMR2前缀
> var.vm_name = "VMR2002"
> local.vmou
"domou2"

# 测试非匹配前缀
> var.vm_name = "VMX999"
> local.vmou
"domou3"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:21