如何在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 } }
原理说明
keys(local.disks)会返回disks映射中所有键的列表,Terraform 0.12及以上版本会保留map的插入顺序,因此列表顺序与你定义disks的顺序一致。index(keys(local.disks), storage.key)会查找当前迭代的disk键(如sda、sdb)在上述列表中的位置,返回从0开始的索引值,实现自动递增效果。
如果需要索引按键的字母顺序排序,可将keys(local.disks)替换为sort(keys(local.disks)),此时索引会按键的字母顺序生成。
内容的提问来源于stack exchange,提问作者AG6HQ
相关产品推荐
相关产品推荐

