英文:
Attach disks to multiple VMs using Terraform
问题
I want to attach disks of different sizes to a particular VM. My code is as follows. 
"Virtual_machine_id" was imported through for loop, but could not be written.
My "output" works fine, but it actually causes problems with the "terraform plan".
- manageddisk.tf
```plaintext
我想将不同大小的磁盘附加到特定的虚拟机上。我的代码如下。
"Virtual_machine_id" 是通过循环导入的,但无法编写。
我的"output"工作正常,但实际上会导致"terraform plan"出现问题。
- manageddisk.tf
- var.tf
 
variable "vm_template" {
  type = map(any)
  default = {
    vm1 = {
      vm_name           = "test01"
      os_publisher      = "MicrosoftWindowsServer"
      os_offer          = "WindowsServer"
      os_sku            = "2022-datacenter-azure-edition"
      license_type      = "Windows_Server"
      os_version        = "latest"
      osdisk_type       = "StandardSSD_LRS"
      osdisk_size       = "1024"
      vm_type           = "Standard_D4s_v5"
    }
    vm2 = {
      vm_name           = "test02"
      os_publisher      = "MicrosoftWindowsServer"
      os_offer          = "WindowsServer"
      os_sku            = "2022-datacenter-azure-edition"
      license_type      = "Windows_Server"
      os_version        = "latest"
      osdisk_type       = "StandardSSD_LRS"
      osdisk_size       = "1024"
      vm_type           = "Standard_D4s_v5"
    }
  }
}
variable "disk_template" {
  type = map(any)
  default = {
    disk1 = {
      managed_disk_name = "data"
      managed_disk_type = "Standard_LRS"
      managed_disk_size = "10"
    }
    disk2 = {
      managed_disk_name = "log"
      managed_disk_type = "Standard_LRS"
      managed_disk_size = "10"
    }
    disk3 = {
      managed_disk_name = "backup"
      managed_disk_type = "Standard_LRS"
      managed_disk_size = "10"
    }
  }
}
However, virtual_machine_id is the problem.
然而,virtual_machine_id 是问题所在。
Successfully attaches disk by acquiring "virtual_machine_id".
通过获取"virtual_machine_id"成功附加磁盘。
I succeeded with the code below. But not yet.
我使用下面的代码成功了。但还没有。
I didn't understand this.
我不明白这个。
Managed Disk
# 托管磁盘
Please let me know if you need further assistance.
英文:
I want to attach disks of different sizes to a particular VM. My code is as follows.
"Virtual_machine_id" was imported through for loop, but could not be written.
My "output" works fine, but it actually causes problems with the "terraform plan".
- manageddisk.tf
 
## 
data "azurerm_virtual_machine" "vm_id" {
  for_each = var.vm_template
  name = each.value.vm_name
  resource_group_name  = data.azurerm_resource_group.system_rg_name.name
}
resource "azurerm_managed_disk" "managed_disk" {
  for_each = {
    for key, value in var.disk_template : key => value
    if value.managed_disk_size != "0"
  }
  name                 = "${each.value.managed_disk_name}"
  location             = var.location
  resource_group_name  = data.azurerm_resource_group.system_rg_name.name
  storage_account_type = each.value.managed_disk_type
  create_option        = "Empty"
  disk_size_gb         = each.value.managed_disk_size
}
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
  for_each = {
    for key, value in var.disk_template : key => value
    if value.managed_disk_size != "0"
  }
  managed_disk_id    = azurerm_managed_disk.managed_disk[each.key].id
  lun                = each.value.managed_disk_size
  caching            = "ReadWrite"
  virtual_machine_id   = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
}
output "vm_id" {
  value = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
}
- var.tf
 
variable "vm_template" {
  type = map(any)
  default = {
    vm1 = {
      vm_name           = "test01"
      os_publisher      = "MicrosoftWindowsServer"
      os_offer          = "WindowsServer"
      os_sku            = "2022-datacenter-azure-edition"
      license_type      = "Windows_Server"
      os_version        = "latest"
      osdisk_type       = "StandardSSD_LRS"
      osdisk_size       = "1024"
      vm_type           = "Standard_D4s_v5"
    }
    vm2 = {
      vm_name           = "test02"
      os_publisher      = "MicrosoftWindowsServer"
      os_offer          = "WindowsServer"
      os_sku            = "2022-datacenter-azure-edition"
      license_type      = "Windows_Server"
      os_version        = "latest"
      osdisk_type       = "StandardSSD_LRS"
      osdisk_size       = "1024"
      vm_type           = "Standard_D4s_v5"
    }
  }
}
variable "disk_template" {
  type = map(any)
  default = {
    disk1 = {
      managed_disk_name = "data"
      managed_disk_type = "Standard_LRS" # Standard_LRS StandardSSD_ZRS Premium_LRS PremiumV2_LRS Premium_ZRS StandardSSD_LRS UltraSSD_LRS
      managed_disk_size = "10"
    }
    disk2 = {
      managed_disk_name = "log"
      managed_disk_type = "Standard_LRS" # Standard_LRS StandardSSD_ZRS Premium_LRS PremiumV2_LRS Premium_ZRS StandardSSD_LRS UltraSSD_LRS
      managed_disk_size = "10"
    }
    disk3 = {
      managed_disk_name = "backup"
      managed_disk_type = "Standard_LRS" # Standard_LRS StandardSSD_ZRS Premium_LRS PremiumV2_LRS Premium_ZRS StandardSSD_LRS UltraSSD_LRS
      managed_disk_size = "10"
    }
  }
}
However, virtual_machine_id is the problem.
╷
│ Error: Incorrect attribute value type
│
│   on manageddisk.tf line 36, in resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach":
│   36:   virtual_machine_id   = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
│     ├────────────────
│     │ data.azurerm_virtual_machine.vm_id is object with 2 attributes
│
│ Inappropriate value for attribute "virtual_machine_id": string required.
╵
╷
│ Error: Incorrect attribute value type
│
│   on manageddisk.tf line 36, in resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach":
│   36:   virtual_machine_id   = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
│     ├────────────────
│     │ data.azurerm_virtual_machine.vm_id is object with 2 attributes
│
│ Inappropriate value for attribute "virtual_machine_id": string required.
╵
╷
│ Error: Incorrect attribute value type
│
│   on manageddisk.tf line 36, in resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach":
│   36:   virtual_machine_id   = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
│     ├────────────────
│     │ data.azurerm_virtual_machine.vm_id is object with 2 attributes
│
│ Inappropriate value for attribute "virtual_machine_id": string required.
╵
Successfully attaches disk by acquiring "virtual_machine_id".
I succeeded with the code below. But not yet.
vm = vm
I didn't understand this.
# ############################
# ### Managed Disk
# ############################
locals {
  disk_vm_flat = merge([
    for vm, vm_vals in var.vm_template : {
      for disk, disk_vals in var.disk_template :
      "${vm_vals.vm_name}-${disk_vals.managed_disk_name}" => {
        vm      = vm
        vm_name = vm_vals.vm_name
        managed_disk_name = disk_vals.managed_disk_name
        managed_disk_size = disk_vals.managed_disk_size
        managed_disk_lun  = disk_vals.managed_disk_lun
        managed_disk_type = disk_vals.managed_disk_type
      } if disk_vals.managed_disk_size != "0"
    }
  ]...)
}
resource "azurerm_managed_disk" "managed_disk" {
  for_each             = local.disk_vm_flat
  name                 = "${each.value.vm_name}-${each.value.managed_disk_name}"
  location             = var.location
  resource_group_name = data.azurerm_resource_group.system_rg_name.name
  storage_account_type = each.value.managed_disk_type
  create_option        = "Empty"
  disk_size_gb         = each.value.managed_disk_size
}
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
  for_each           = local.disk_vm_flat
  managed_disk_id    = azurerm_managed_disk.managed_disk[each.key].id
  lun                = each.value.managed_disk_lun
  caching            = "ReadWrite"
  virtual_machine_id = azurerm_windows_virtual_machine.vm[each.value.vm].id
}
答案1
得分: 0
你基本上需要一个双重循环,在使用之前需要将其展开:
locals {
  disk_vm_flat = merge([
    for vm, vm_vals in var.vm_template : {
      for disk, disk_vals in var.disk_template :
        "${vm_vals.vm_name}-${disk_vals.managed_disk_name}" => {
            vm_name = vm
            managed_disk_name = disk
            managed_disk_size = disk_vals.managed_disk_size
        } if disk_vals.managed_disk_size != "0"
    }
  ]...) # 不要删除这些点,它们很重要
}
然后
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
  for_each           = local.disk_vm_flat
  managed_disk_id    = azurerm_managed_disk.managed_disk[each.value.managed_disk_name].id
  lun                = each.value.managed_disk_size
  caching            = "ReadWrite"
  virtual_machine_id   = data.azurerm_virtual_machine.vm_id[each.value.vm_name].id
}
英文:
You basically need a double for loop, which you need to flatten first before the use:
locals {
  disk_vm_flat = merge([
    for vm, vm_vals in var.vm_template:  {
      for disk, disk_vals in var.disk_template:
        "${vm_vals.vm_name}-${disk_vals.managed_disk_name}" => {
            vm_name = vm
            managed_disk_name = disk
            managed_disk_size = disk_vals.managed_disk_size
        }  if disk_vals.managed_disk_size != "0"
    }
  ]...) # do NOT remove the dots. they are important
} 
then
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
  for_each           = local.disk_vm_flat
  managed_disk_id    = azurerm_managed_disk.managed_disk[each.value.managed_disk_name].id
  lun                = each.value.managed_disk_size
  caching            = "ReadWrite"
  virtual_machine_id   = data.azurerm_virtual_machine.vm_id[each.value.vm_name].id
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论