如何创建N个VM,每个VM创建并附加M个磁盘?

时间:2020-09-07 11:20:35

标签: azure count terraform

resource "azurerm_windows_virtual_machine" "virtual_machine" { 
    count = var.vm_count 
    name  = "${local.vm_name}${count.index +1}"

resource "azurerm_virtual_machine_data_disk_attachment" "datadisk01" {
    count              = var.disk_count  
    **virtual_machine_id = azurerm_windows_virtual_machine.virtual_machine[count.index].id
    managed_disk_id    = element("${module.DISK.datadisk_id}","${count.index}")

}

问题-我有2个差异计数变量vm_count和disk_count。 我想要一个通用的解决方案,例如。如果虚拟机计数为2,并且每个虚拟机应具有3个数据磁盘,即disk_count为3。

我能够根据计数创建多个VM和磁盘。但是在vm和磁盘附件时遇到问题,因为我无法在同一资源中使用2个计数。 如何处理这种情况?

面对的问题设为**

总而言之,我想创建vm_count(N)个虚拟机,并创建disk_count(M)个磁盘并将其附加到每个虚拟机。

如何创建N个VM,每个VM创建并附加M个磁盘?

2 个答案:

答案 0 :(得分:1)

您可以使用一组索引来实现以下目的:

locals {

  indexes = {
    for vmi in range(var.vm_count): vmi => [
      for ddi in range(var.disk_count):
        ddi
    ]
  }

}

这将创建一个这样的地图:

{
  "0" = [
    0,
    1,
    2,
  ]
  "1" = [
    0,
    1,
    2,
  ]
}

以后以这种方式使用:

resource "azurerm_virtual_machine_data_disk_attachment" "datadisk01" {
    for_each = local.indexes

    virtual_machine_id = azurerm_windows_virtual_machine.virtual_machine[tonumber(each.key)].id
    managed_disk_id    = element("${module.DISK.datadisk_id}","${each.value[0]}")
}

我还没有完全测试输出,因为VM需要更多配置。但是,正如我所看到的,您将locals用于vm_name,我将创建一个映射/对象,其VM名称包含索引,值和所需的磁盘。

我希望这有助于解决问题。

答案 1 :(得分:0)

我在资源中拥有2个循环的唯一方法是使用动态块。

类似这样的东西:

resource "azurerm_windows_virtual_machine" "virtual_machine" { 
    count = var.vm_count 
    name  = "${local.vm_name}${count.index +1}"

    dynamic "setting" {
     for_each = var.disk_count
     content {
        ##Storage_disk block
     }
   }

然后,如果需要,您可以使用each.value访问索引。