首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Terraform Azure的多个虚拟机和磁盘

使用Terraform Azure的多个虚拟机和磁盘
EN

Stack Overflow用户
提问于 2021-03-01 17:45:43
回答 1查看 683关注 0票数 0

我有一个需求,我需要创建多个Azure Windows虚拟机,其中有多个磁盘,每个磁盘都具有不同的大小,并将每个虚拟机放置在不同的AZ中(因此,如果我传入3个VM名称,每个名称将与磁盘一起转到不同的AZ )。

当我需要分配不同大小的磁盘时,我已经让相同大小的磁盘工作了。

提前感谢您的帮助。

到目前为止,我有以下代码:

代码语言:javascript
运行
复制
variable "instances" {
    description = "No. of instances"
    type = list(string)
    default = ["vm-1", "vm-2"]
}


variable "nb_disks_per_instance" {
    description = "No. disks per vm"
    type = number
    default = 2
    
}

variable "disks" {
    description = "disk sizes"
    type = list(number)
    default = [10, 20, 30]
}

locals {

  vm_datadiskdisk_count_map = { for k in toset(var.instances) : k => var.nb_disks_per_instance }
  luns                      = { for k in local.datadisk_lun_map : k.datadisk_name => k.lun }

  datadisk_lun_map = flatten([
    for vm_name, count in local.vm_datadiskdisk_count_map : [
      for i in range(count) : {
        datadisk_name = format("%s_Data_Disk_%02d", vm_name, i)
        lun           = i
      }
    ]
  ])

}

output "myMap" {
  value = local.datadisk_lun_map
}
 
resource "azurerm_managed_disk" "managed_disk" {
  for_each             = toset([for j in local.datadisk_lun_map : j.datadisk_name])
  name                 = replace(each.key, "_", "-")
  location             = "UK South"
  resource_group_name  = "rg-one"
  storage_account_type = "Standard_LRS"
  create_option        = "Empty"
  disk_size_gb         = 20
  tags                 = local.common_tags
  zones                = ["1"] 

}

resource "azurerm_virtual_machine_data_disk_attachment" "managed_disk_attach" {
  for_each           = toset([for j in local.datadisk_lun_map : j.datadisk_name])
  managed_disk_id    = azurerm_managed_disk.managed_disk[each.key].id
  virtual_machine_id = azurerm_windows_virtual_machine.vm[element(split("_", each.key), 0)].id
  lun                = lookup(local.luns, each.key)
  caching            = "ReadWrite"
}

resource "azurerm_network_interface" "nic" {
  for_each            = toset(var.instances)
  location            = "UK South"
  name                = "${each.key}-NIC"
  resource_group_name = "rg-one"
  ip_configuration {
    name                          = "internal"
    private_ip_address_allocation = "Dynamic"
    subnet_id                     = data.azurerm_subnet.subnet.id
  } 
  tags = local.common_tags

}

resource "azurerm_windows_virtual_machine" "vm" {
  for_each       = toset(var.instances)
  admin_password = <ENTER PW>
  admin_username = "test"
  location = "UK South"
  name = each.key
  network_interface_ids = [azurerm_network_interface.nic[format("%s", each.key)].id]
  resource_group_name = "rg-one"
  size = "Standard_D4s_v4"
  tags = local.common_tags
  zone = index(var.instances, each.value) + 1

 os_disk {
    caching = "ReadWrite"
    storage_account_type = "Premium_LRS"
    name = "${each.key}-OS-DISK-00"
  }



} 
EN

回答 1

Stack Overflow用户

发布于 2021-03-02 10:40:58

按照您的方式,创建一个具有多个磁盘的VM很容易,但创建具有不同大小和数量的磁盘的多个VM却很困难。最好的方法是使用Terraform模块。

该模块类似于您用于创建具有多个磁盘的一个VM的方法,因此我将只向您展示如何使用该模块:

代码语言:javascript
运行
复制
variable "vms" {
    type = map(object({
        size = string
        admin_user = string
        admin_password = string
        disks = list(number)
    }))
}

module "vms" {
    for_each = var.vms
    
    source = "./modules/vm"
    resource_group_name = var.rg_name
    vm_name = each.key
    vm = each.value
    disks = each.value["disks"]
    location = var.location
}

terraform.tfvar

代码语言:javascript
运行
复制
rg_name = "charlesVMs"
location = "East US"
vms ={
  azurevm1 = {
    
    size = "Standard_DS1_v2"
    admin_user = "azureuser"
    admin_password = "azureuser@2021"
    disks = [30, 30]
  }
}

这个例子只是提供了一个方向来解决你的需求,获取关于另一个issue的更多细节。如果你有任何关于这个问题的问题,请让我知道,我很乐意帮助你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66419797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档