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

如何在Terraform中将list类型参数cat设置为可选参数

解决Terraform中可选cat参数的VM按颜色分组问题

原始配置

abc:
  - vm_name: "abc"
    template:
      cate: Apple
      image: "ubuntu18"
    cpu_cores: 1
    memory: 1024
    cat:
      - red
      - geen
      - blue
  - vm_name: "xyz"
    template:
      cate: Orange
      image: "ubuntu18"
    cpu_cores: 1
    memory: 1024
    cat:
      - red
      - blue
      - yellow
      - black

原始分组代码

用以下Terraform代码可将VM按cat字段的颜色分组:

locals {
  cfg_vars = yamldecode(file("test1.yaml"))
  list_color = flatten(local.config_vars["abc"][*]["cat"])

  inventory_map = merge([for color in local.list_color: {
    for vm in local.cfg_vars["abc"]:
      color => vm.vm_name... if contains(vm.cat, color)
      } 
  ]...)
}

原始运行结果

执行后local.inventory_map的分组结果如下:

{     
  "black" = [
    "xyz",  
  ]         
  "blue" = [
    "abc",  
    "xyz",  
  ]         
  "geen" = [  
    "abc",    
  ]        
  "red" = [   
    "abc",               
    "xyz",               
  ]           
  "yellow" = [           
    "xyz",               
  ]                       
}        

问题场景

现在需要让cat参数成为可选字段,当配置中存在未定义cat的VM(如下方的efg)时,原始代码会因找不到cat字段报错,需修改代码兼容该场景,同时保持分组结果和之前一致。

带可选cat参数的配置示例:

abc:
  - vm_name: "abc"
    template:
      cate: Apple
      image: "ubuntu18"
    cpu_cores: 1
    memory: 1024
    cat:
      - red
      - geen
      - blue
  - vm_name: "xyz"
    template:
      cate: Orange
      image: "ubuntu18"
    cpu_cores: 1
    memory: 1024
    cat:
      - red
      - blue
      - yellow
      - black
  - vm_name: "efg"
    template:
      cate: Orange
      image: "ubuntu18"
    cpu_cores: 1
    memory: 1024

修改后的兼容代码

通过lookup函数处理可选字段,当cat不存在时返回空列表,既避免报错又自动过滤无颜色的VM:

locals {
  cfg_vars = yamldecode(file("test1.yaml"))
  # 遍历所有VM,用lookup获取cat,不存在则返回空列表,再扁平化得到所有颜色
  list_color = flatten([for vm in local.cfg_vars["abc"] : lookup(vm, "cat", [])])

  inventory_map = merge([for color in local.list_color: {
    for vm in local.cfg_vars["abc"]:
      # 同样用lookup处理每个VM的cat字段,空列表时contains返回false,自动跳过该VM
      color => vm.vm_name... if contains(lookup(vm, "cat", []), color)
      } 
  ]...)
}

预期运行结果

修改后执行代码,local.inventory_map会和原始结果一致:

{     
  "black" = [
    "xyz",  
  ]         
  "blue" = [
    "abc",  
    "xyz",  
  ]         
  "geen" = [  
    "abc",    
  ]        
  "red" = [   
    "abc",               
    "xyz",               
  ]           
  "yellow" = [           
    "xyz",               
  ]                       
} 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:57:47