使用Terraform将磁盘附加到多个虚拟机

huangapple go评论93阅读模式
英文:

Attach disks to multiple VMs using Terraform

问题

  1. I want to attach disks of different sizes to a particular VM. My code is as follows.
  2. "Virtual_machine_id" was imported through for loop, but could not be written.
  3. My "output" works fine, but it actually causes problems with the "terraform plan".
  4. - manageddisk.tf
  5. ```plaintext
  6. 我想将不同大小的磁盘附加到特定的虚拟机上。我的代码如下。
  7. "Virtual_machine_id" 是通过循环导入的,但无法编写。
  8. 我的"output"工作正常,但实际上会导致"terraform plan"出现问题。
  9. - manageddisk.tf
  • var.tf
  1. variable "vm_template" {
  2. type = map(any)
  3. default = {
  4. vm1 = {
  5. vm_name = "test01"
  6. os_publisher = "MicrosoftWindowsServer"
  7. os_offer = "WindowsServer"
  8. os_sku = "2022-datacenter-azure-edition"
  9. license_type = "Windows_Server"
  10. os_version = "latest"
  11. osdisk_type = "StandardSSD_LRS"
  12. osdisk_size = "1024"
  13. vm_type = "Standard_D4s_v5"
  14. }
  15. vm2 = {
  16. vm_name = "test02"
  17. os_publisher = "MicrosoftWindowsServer"
  18. os_offer = "WindowsServer"
  19. os_sku = "2022-datacenter-azure-edition"
  20. license_type = "Windows_Server"
  21. os_version = "latest"
  22. osdisk_type = "StandardSSD_LRS"
  23. osdisk_size = "1024"
  24. vm_type = "Standard_D4s_v5"
  25. }
  26. }
  27. }
  28. variable "disk_template" {
  29. type = map(any)
  30. default = {
  31. disk1 = {
  32. managed_disk_name = "data"
  33. managed_disk_type = "Standard_LRS"
  34. managed_disk_size = "10"
  35. }
  36. disk2 = {
  37. managed_disk_name = "log"
  38. managed_disk_type = "Standard_LRS"
  39. managed_disk_size = "10"
  40. }
  41. disk3 = {
  42. managed_disk_name = "backup"
  43. managed_disk_type = "Standard_LRS"
  44. managed_disk_size = "10"
  45. }
  46. }
  47. }

However, virtual_machine_id is the problem.

  1. 然而,virtual_machine_id 是问题所在。

Successfully attaches disk by acquiring "virtual_machine_id".

  1. 通过获取"virtual_machine_id"成功附加磁盘。

I succeeded with the code below. But not yet.

  1. 我使用下面的代码成功了。但还没有。

I didn't understand this.

  1. 我不明白这个。

Managed Disk

  1. # 托管磁盘

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
  1. ##
  2. data "azurerm_virtual_machine" "vm_id" {
  3. for_each = var.vm_template
  4. name = each.value.vm_name
  5. resource_group_name = data.azurerm_resource_group.system_rg_name.name
  6. }
  7. resource "azurerm_managed_disk" "managed_disk" {
  8. for_each = {
  9. for key, value in var.disk_template : key => value
  10. if value.managed_disk_size != "0"
  11. }
  12. name = "${each.value.managed_disk_name}"
  13. location = var.location
  14. resource_group_name = data.azurerm_resource_group.system_rg_name.name
  15. storage_account_type = each.value.managed_disk_type
  16. create_option = "Empty"
  17. disk_size_gb = each.value.managed_disk_size
  18. }
  19. resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
  20. for_each = {
  21. for key, value in var.disk_template : key => value
  22. if value.managed_disk_size != "0"
  23. }
  24. managed_disk_id = azurerm_managed_disk.managed_disk[each.key].id
  25. lun = each.value.managed_disk_size
  26. caching = "ReadWrite"
  27. virtual_machine_id = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
  28. }
  29. output "vm_id" {
  30. value = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
  31. }
  • var.tf
  1. variable "vm_template" {
  2. type = map(any)
  3. default = {
  4. vm1 = {
  5. vm_name = "test01"
  6. os_publisher = "MicrosoftWindowsServer"
  7. os_offer = "WindowsServer"
  8. os_sku = "2022-datacenter-azure-edition"
  9. license_type = "Windows_Server"
  10. os_version = "latest"
  11. osdisk_type = "StandardSSD_LRS"
  12. osdisk_size = "1024"
  13. vm_type = "Standard_D4s_v5"
  14. }
  15. vm2 = {
  16. vm_name = "test02"
  17. os_publisher = "MicrosoftWindowsServer"
  18. os_offer = "WindowsServer"
  19. os_sku = "2022-datacenter-azure-edition"
  20. license_type = "Windows_Server"
  21. os_version = "latest"
  22. osdisk_type = "StandardSSD_LRS"
  23. osdisk_size = "1024"
  24. vm_type = "Standard_D4s_v5"
  25. }
  26. }
  27. }
  28. variable "disk_template" {
  29. type = map(any)
  30. default = {
  31. disk1 = {
  32. managed_disk_name = "data"
  33. managed_disk_type = "Standard_LRS" # Standard_LRS StandardSSD_ZRS Premium_LRS PremiumV2_LRS Premium_ZRS StandardSSD_LRS UltraSSD_LRS
  34. managed_disk_size = "10"
  35. }
  36. disk2 = {
  37. managed_disk_name = "log"
  38. managed_disk_type = "Standard_LRS" # Standard_LRS StandardSSD_ZRS Premium_LRS PremiumV2_LRS Premium_ZRS StandardSSD_LRS UltraSSD_LRS
  39. managed_disk_size = "10"
  40. }
  41. disk3 = {
  42. managed_disk_name = "backup"
  43. managed_disk_type = "Standard_LRS" # Standard_LRS StandardSSD_ZRS Premium_LRS PremiumV2_LRS Premium_ZRS StandardSSD_LRS UltraSSD_LRS
  44. managed_disk_size = "10"
  45. }
  46. }
  47. }

However, virtual_machine_id is the problem.

  1. Error: Incorrect attribute value type
  2. on manageddisk.tf line 36, in resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach":
  3. 36: virtual_machine_id = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
  4. ├────────────────
  5. data.azurerm_virtual_machine.vm_id is object with 2 attributes
  6. Inappropriate value for attribute "virtual_machine_id": string required.
  7. Error: Incorrect attribute value type
  8. on manageddisk.tf line 36, in resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach":
  9. 36: virtual_machine_id = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
  10. ├────────────────
  11. data.azurerm_virtual_machine.vm_id is object with 2 attributes
  12. Inappropriate value for attribute "virtual_machine_id": string required.
  13. Error: Incorrect attribute value type
  14. on manageddisk.tf line 36, in resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach":
  15. 36: virtual_machine_id = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
  16. ├────────────────
  17. data.azurerm_virtual_machine.vm_id is object with 2 attributes
  18. 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.

  1. vm = vm

I didn't understand this.

  1. # ############################
  2. # ### Managed Disk
  3. # ############################
  4. locals {
  5. disk_vm_flat = merge([
  6. for vm, vm_vals in var.vm_template : {
  7. for disk, disk_vals in var.disk_template :
  8. "${vm_vals.vm_name}-${disk_vals.managed_disk_name}" => {
  9. vm = vm
  10. vm_name = vm_vals.vm_name
  11. managed_disk_name = disk_vals.managed_disk_name
  12. managed_disk_size = disk_vals.managed_disk_size
  13. managed_disk_lun = disk_vals.managed_disk_lun
  14. managed_disk_type = disk_vals.managed_disk_type
  15. } if disk_vals.managed_disk_size != "0"
  16. }
  17. ]...)
  18. }
  19. resource "azurerm_managed_disk" "managed_disk" {
  20. for_each = local.disk_vm_flat
  21. name = "${each.value.vm_name}-${each.value.managed_disk_name}"
  22. location = var.location
  23. resource_group_name = data.azurerm_resource_group.system_rg_name.name
  24. storage_account_type = each.value.managed_disk_type
  25. create_option = "Empty"
  26. disk_size_gb = each.value.managed_disk_size
  27. }
  28. resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
  29. for_each = local.disk_vm_flat
  30. managed_disk_id = azurerm_managed_disk.managed_disk[each.key].id
  31. lun = each.value.managed_disk_lun
  32. caching = "ReadWrite"
  33. virtual_machine_id = azurerm_windows_virtual_machine.vm[each.value.vm].id
  34. }

答案1

得分: 0

你基本上需要一个双重循环,在使用之前需要将其展开:

  1. locals {
  2. disk_vm_flat = merge([
  3. for vm, vm_vals in var.vm_template : {
  4. for disk, disk_vals in var.disk_template :
  5. "${vm_vals.vm_name}-${disk_vals.managed_disk_name}" => {
  6. vm_name = vm
  7. managed_disk_name = disk
  8. managed_disk_size = disk_vals.managed_disk_size
  9. } if disk_vals.managed_disk_size != "0"
  10. }
  11. ]...) # 不要删除这些点,它们很重要
  12. }

然后

  1. resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
  2. for_each = local.disk_vm_flat
  3. managed_disk_id = azurerm_managed_disk.managed_disk[each.value.managed_disk_name].id
  4. lun = each.value.managed_disk_size
  5. caching = "ReadWrite"
  6. virtual_machine_id = data.azurerm_virtual_machine.vm_id[each.value.vm_name].id
  7. }
英文:

You basically need a double for loop, which you need to flatten first before the use:

  1. locals {
  2. disk_vm_flat = merge([
  3. for vm, vm_vals in var.vm_template: {
  4. for disk, disk_vals in var.disk_template:
  5. "${vm_vals.vm_name}-${disk_vals.managed_disk_name}" => {
  6. vm_name = vm
  7. managed_disk_name = disk
  8. managed_disk_size = disk_vals.managed_disk_size
  9. } if disk_vals.managed_disk_size != "0"
  10. }
  11. ]...) # do NOT remove the dots. they are important
  12. }

then

  1. resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
  2. for_each = local.disk_vm_flat
  3. managed_disk_id = azurerm_managed_disk.managed_disk[each.value.managed_disk_name].id
  4. lun = each.value.managed_disk_size
  5. caching = "ReadWrite"
  6. virtual_machine_id = data.azurerm_virtual_machine.vm_id[each.value.vm_name].id
  7. }

huangapple
  • 本文由 发表于 2023年3月3日 22:18:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/75628230.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定