Terraform Azure:当从自定义映像配置VM时,如何配置数据磁盘的类型

Terraform Azure:当从自定义映像配置VM时,如何配置数据磁盘的类型,azure,terraform,Azure,Terraform,我需要使用Terraform从自定义映像提供Azure中的VM数量。映像相当复杂,它定义了一台具有16个数据磁盘的机器,这些磁盘预先配置为运行高性能Oracle数据库。我的假设是,我不必在azurerm\u虚拟机资源内配置storage\u data\u disk块,因为所有磁盘都已在映像内配置 这似乎是真的。如果我使用自定义的存储\u映像\u参考创建虚拟机–所有数据磁盘都是使用正确的LUN和大小创建的,所有预装软件都按预期工作: resource "azurerm_virtual_machin

我需要使用Terraform从自定义映像提供Azure中的VM数量。映像相当复杂,它定义了一台具有16个数据磁盘的机器,这些磁盘预先配置为运行高性能Oracle数据库。我的假设是,我不必在
azurerm\u虚拟机
资源内配置
storage\u data\u disk
块,因为所有磁盘都已在映像内配置

这似乎是真的。如果我使用自定义的
存储\u映像\u参考创建虚拟机
–所有数据磁盘都是使用正确的LUN和大小创建的,所有预装软件都按预期工作:

resource "azurerm_virtual_machine" "database" {
  name                  = "${var.prefix}-vm"
  location              = "${azurerm_resource_group.main.location}"
  resource_group_name   = "${azurerm_resource_group.main.name}"
  network_interface_ids = ["${azurerm_network_interface.main.id}"]
  vm_size               = "Standard_E16s_v3"

  delete_os_disk_on_termination = true
  delete_data_disks_on_termination = true

  storage_image_reference {
    id = "/subscriptions/ABC/resourceGroups/XYZ/providers/Microsoft.Compute/images/CUSTOM-IMAGE"
  }

  storage_os_disk {
    name              = "${var.prefix}-os-disk"
    create_option     = "FromImage"
    managed_disk_type = "Premium_LRS"
  }

  os_profile {
    computer_name  = "hostname"
    admin_username = "testadmin"
    admin_password = "Password1234!"
  }

  os_profile_linux_config {
    disable_password_authentication = false
  }
}
问题是所有的数据磁盘都是标准的HDD,这是最慢的磁盘类型,我希望它们是高级的SSD,就像从中拍摄图像的原始VM一样

最终,我通过为
azurerm\u虚拟机
资源中的每个数据磁盘添加显式存储\u数据\u磁盘块解决了这个问题,如下所示:

resource "azurerm_virtual_machine" "database" {
  name                  = "${var.prefix}-vm"
  location              = "${azurerm_resource_group.main.location}"
  resource_group_name   = "${azurerm_resource_group.main.name}"
  network_interface_ids = ["${azurerm_network_interface.main.id}"]
  vm_size               = "Standard_E16s_v3"

  delete_os_disk_on_termination    = true
  delete_data_disks_on_termination = true

  storage_image_reference {
    id = "/subscriptions/ABC/resourceGroups/XYZ/providers/Microsoft.Compute/images/CUSTOM-IMAGE"
  }

  #-------------------------------------------------------------------
  #   Explicit Data Disk configuration starts here
  #-------------------------------------------------------------------

  storage_data_disk {
    name              = "home-disk"
    managed_disk_type = "Premium_LRS"
    disk_size_gb      = 100
    create_option     = "FromImage"
    lun               = 0
  }

  storage_data_disk {
    name              = "u01-disk"
    managed_disk_type = "Premium_LRS"
    disk_size_gb      = 200
    create_option     = "FromImage"
    lun               = 1
  }

  storage_data_disk {
    name              = "backup-disk-0"
    managed_disk_type = "Premium_LRS"
    disk_size_gb      = 1023
    create_option     = "FromImage"
    lun               = 2
  }

  #-------------------------------------------------------------------
  #   Skipped 12 disks ...
  #-------------------------------------------------------------------

  storage_data_disk {
    name              = "data-disk-9"
    managed_disk_type = "Premium_LRS"
    disk_size_gb      = 512
    create_option     = "FromImage"
    lun               = 15
  }

  #-------------------------------------------------------------------
  #   Explicit Data Disk configuration ends here
  #-------------------------------------------------------------------

  storage_os_disk {
    name              = "${var.prefix}-os-disk"
    create_option     = "FromImage"
    managed_disk_type = "Premium_LRS"
  }

  os_profile {
    computer_name  = "hostname"
    admin_username = "testadmin"
    admin_password = "Password1234!"
  }

  os_profile_linux_config {
    disable_password_authentication = false
  }
}
这是可行的,所有数据磁盘现在都创建为Premium_SSD,但这种解决方案感觉是错误的,因为它必须始终与源映像保持完全同步。如果准备该映像的团队决定添加/删除磁盘或更改其中一个磁盘的大小,则该更改必须反映在我的TF模板中

有趣的是,当使用Azure Portal UI从同一映像创建新VM时,所有数据磁盘都被创建为Premium\u SSD。我不必配置它们,甚至不知道映像中定义了多少数据磁盘或它们的大小。但当我使用Terraform时,所有数据磁盘都创建为标准的硬盘

有没有一种方法可以告诉Terraform/Azure provider使用哪种磁盘类型从自定义映像配置VM,而无需显式配置每个映像


谢谢大家!

不幸的是,在通过Terraform创建Azure VM时,确定磁盘类型的方法正是您所指的方法。据我所知,这是地球上唯一的道路

要决定VM中所有磁盘的磁盘类型,应该有一个参数可供选择。在Azure Portal中,您可以为操作系统磁盘类型选择Premium SSD,然后VM将在Premium SSD中创建所有操作系统磁盘和数据磁盘

另外,当您通过Azure CLI从自定义映像创建VM时,有一个参数可供您设置磁盘类型:
--存储sku
。您可以输入Premium_LRS值,以在Premium SSD中创建所有磁盘。看

但不幸的是,您目前无法在Terraform中找到虚拟机的属性。也许你可以在Terraform社区中添加这个问题来改进它