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

如何在Hashicorp Packer的for_each循环中生成递增的磁盘控制器索引

问题:Terraform动态块中实现disk_controller_index自动递增

现有如下HCL本地变量定义:

locals {
  disks = {
    sda = {
      size = 1024
      thin = true
    }
    sdb = {
      size = 2048
      thin = false
    }
  }
}

以及source "vsphere-iso" "linux-rhel"中的dynamic storage块:

dynamic "storage" {
  for_each = local.disks
  content {
    disk_size             = storage.value.size
    disk_thin_provisioned = storage.value.thin
    disk_controller_index = ???
  }
}

需要替换上述代码中的???,让disk_controller_index在每次迭代时自动递增,且不想手动在disks映射中添加索引字段。


解决方案

可以利用Terraform的keys()和index()函数组合实现自动递增的索引,修改后的代码如下:

dynamic "storage" {
  for_each = local.disks
  content {
    disk_size             = storage.value.size
    disk_thin_provisioned = storage.value.thin
    # 生成从0开始的递增索引
    disk_controller_index = index(keys(local.disks), storage.key)
    # 若需要从1开始计数,使用下面的写法:
    # disk_controller_index = index(keys(local.disks), storage.key) + 1
  }
}

原理说明

  1. keys(local.disks)会返回disks映射中所有键的列表,Terraform 0.12及以上版本会保留map的插入顺序,因此列表顺序与你定义disks的顺序一致。
  2. index(keys(local.disks), storage.key)会查找当前迭代的disk键(如sda、sdb)在上述列表中的位置,返回从0开始的索引值,实现自动递增效果。

如果需要索引按键的字母顺序排序,可将keys(local.disks)替换为sort(keys(local.disks)),此时索引会按键的字母顺序生成。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:02:13