Terraform通过substr匹配VM名称获取OU路径失败求助
修复Terraform VM名称匹配OU路径的条件判断问题
问题根源
你的代码有两个关键问题导致条件始终不匹配:
- 错误依赖固定长度子串:用
substr取前4位判断前缀,若VM名称格式变动(比如前缀长度变化)就会失效,且旧版Terraform的嵌套插值语法${"${var.vm_name}"}可能引发解析异常。 - 使用过时的插值语法: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
相关产品推荐
相关产品推荐

