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

时间:2019-03-25 18:59:13

标签: azure terraform

我需要使用Terraform从自定义映像中配置Azure中的VM数量。该映像相当复杂,它定义了一台具有16个数据磁盘的计算机,该磁盘已预先配置为运行高性能Oracle数据库。我的假设是我不必在storage_data_disk资源内部配置azurerm_virtual_machine块,因为所有磁盘都已在Image内部配置。

那似乎是真的。如果我使用自定义storage_image_reference创建VM,则所有数据磁盘都是使用正确的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
  }
}

问题在于,所有数据磁盘都是 Standard_HDD ,这是最慢的磁盘类型,我希望它们成为 Premium_SSD ,就像在原始VM中创建映像一样被采取了。

最终,我通过为azurerm_virtual_machine资源内的每个数据磁盘添加显式的storage_data_disk块来解决该问题,如下所示:

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 的形式创建,但是这种解决方案感到不对,因为必须始终与源Image保持完美同步。如果准备Image的团队决定添加/删除磁盘或更改其中一个磁盘的大小-该更改必须反映在我的TF模板中。

有趣的是,当使用Azure Portal UI从同一映像创建新VM时,所有数据磁盘均创建为 Premium_SSD 。我不必配置它们,甚至根本不知道映像中定义了多少个数据磁盘或其大小。但是,当我使用Terraform时–将所有数据磁盘创建为 Standard_HDD

是否有一种方法可以告诉Terraform / Azure提供程序要从“自定义映像” 配置的虚拟机使用哪种磁盘类型,而无需显式配置它们

谢谢!

1 个答案:

答案 0 :(得分:1)

不幸的是,通过Terraform创建Azure VM时决定磁盘类型的方法只是您所引用的一种。据我所知,这是Terraform中的唯一方法。

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

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

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