使用For_each参数使用托管磁盘创建多个不同的Azure Win服务器

qkf9rpyu  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(195)

刚接触terraform时,我一直在使用count参数在Azure中创建VM。最佳实践建议使用For_each参数而不是使用count。我遇到过想要更改某些服务器配置的问题。
我从人们的建议中提取了一些代码,在下面的代码中,它将为每个虚拟机创建一个托管磁盘。
然而,托管磁盘并不是独立的,因为如果我更改托管磁盘的磁盘大小,它将更改所有虚拟机的磁盘大小。我如何才能实现每个虚拟机的托管磁盘具有不同的磁盘大小。我确实尝试将托管磁盘添加到每个虚拟机的变量局部变量中的单个键。
任何提示/建议将不胜感激!

  1. Under a subdirectory
  2. #########################################################################################
  3. variable.tf
  4. variable "m_resource_group_name" {
  5. description = "This is defines the resouce grp name"
  6. }
  7. variable "m_location" {
  8. description = "This is defines the location"
  9. }
  10. variable "m_subnet_id" {
  11. description = "The ID of the subnet "
  12. }
  13. variable "m_admin_username" {
  14. description = "admin username"
  15. }
  16. variable "m_vault_name_id" {
  17. description = "Azure Key Vault data source"
  18. type = object({
  19. id = string
  20. name = string
  21. resource_group_name = string
  22. })
  23. }
  24. variable "winserver-test-pw" {
  25. description = "admin pw"
  26. }
  27. ############################# NEW variable map #######################
  28. variable "vm_map" {
  29. description = "values for the server"
  30. type = map(object({
  31. name = string
  32. size = string
  33. }))
  34. default = {
  35. "vm1" = {
  36. name = "vm1"
  37. size = "Standard_DC2ds_v3"
  38. nic = "nic1"
  39. }
  40. "vm2" = {
  41. name = "vm2"
  42. size = "Standard_DC2ds_v3"
  43. nic = "nic1"
  44. }
  45. }
  46. }
  47. variable "disk_template" {
  48. type = map(any)
  49. default = {
  50. disk1 = {
  51. managed_disk_name = "data-disk1"
  52. managed_disk_type = "StandardSSD_LRS"
  53. managed_disk_size = "10"
  54. managed_disk_lun = "2"
  55. managed_disk_caching = "ReadWrite"
  56. create_option = "Empty"
  57. os_type = "Windows"
  58. }
  59. }
  60. }
  61. #####################################################################################################
  62. locals.tf
  63. # Managed Disk
  64. locals {
  65. disk_vm_flat = merge([
  66. for vm, vm_vals in var.vm_map : {
  67. for disk, disk_vals in var.disk_template :
  68. "${vm_vals.name}-${disk_vals.managed_disk_name}" => {
  69. name = vm_vals.name
  70. managed_disk_name = disk_vals.managed_disk_name
  71. managed_disk_size = disk_vals.managed_disk_size
  72. managed_disk_lun = disk_vals.managed_disk_lun
  73. managed_disk_type = disk_vals.managed_disk_type
  74. managed_disk_caching = disk_vals.managed_disk_caching
  75. os_type = disk_vals.os_type
  76. create_option = disk_vals.create_option
  77. } if disk_vals.managed_disk_size != "0"
  78. }
  79. ]...) # Do not remove the dots.
  80. }
  81. #######################################################################################################
  82. main.tf
  83. resource "azurerm_network_interface" "nic-multi-vms-01" {
  84. for_each = var.vm_map
  85. name = "${each.value.name}-nic" #append the keyname to nic at the end
  86. location = var.m_location
  87. resource_group_name = var.m_resource_group_name
  88. ip_configuration {
  89. name = "${each.value.name}-ipconf"
  90. subnet_id = var.m_subnet_id
  91. private_ip_address_allocation = "Dynamic"
  92. }
  93. }
  94. resource "azurerm_windows_virtual_machine" "winservertest" {
  95. for_each = var.vm_map
  96. name = each.value.name
  97. resource_group_name = var.m_resource_group_name
  98. location = var.m_location
  99. size = each.value.size
  100. admin_username = var.m_admin_username
  101. admin_password = var.winserver-test-pw
  102. patch_mode = "Manual"
  103. enable_automatic_updates = false
  104. network_interface_ids = [
  105. azurerm_network_interface.nic-multi-vms-01[each.key].id
  106. ]
  107. os_disk {
  108. name = "${each.value.name}-OS"
  109. caching = "ReadWrite"
  110. storage_account_type = "Standard_LRS"
  111. disk_size_gb = 127
  112. }
  113. source_image_reference {
  114. publisher = "MicrosoftWindowsServer"
  115. offer = "WindowsServer"
  116. sku = "2019-Datacenter"
  117. version = "latest"
  118. }
  119. }
  120. resource "azurerm_managed_disk" "managed_disk" {
  121. for_each = local.disk_vm_flat
  122. name = "${each.value.name}-${each.value.managed_disk_name}"
  123. location = var.m_location
  124. resource_group_name = var.m_resource_group_name
  125. storage_account_type = each.value.managed_disk_type
  126. create_option = each.value.create_option
  127. os_type = each.value.os_type
  128. disk_size_gb = each.value.managed_disk_size
  129. }
  130. resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
  131. for_each = local.disk_vm_flat
  132. managed_disk_id = azurerm_managed_disk.managed_disk[each.key].id
  133. lun = each.value.managed_disk_lun
  134. caching = each.value.managed_disk_caching
  135. virtual_machine_id = azurerm_windows_virtual_machine.winservertest[each.value.name].id #amended
  136. }
  137. # ############################
  138. # ### output info
  139. # ############################
  140. output "vm_ids" {
  141. value = { for vm, vm_vals in var.vm_map : vm => vm_vals }
  142. }

字符串

oug3syen

oug3syen1#

这是因为所有VM都有一个disk_template。如果您希望每个VM具有不同的磁盘大小,则必须将managed_disk_size移动到var.vm_map。这样,您可以为不同的VM提供不同的磁盘大小。

相关问题