我需要使用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提供程序要从“自定义映像” 配置的虚拟机使用哪种磁盘类型,而无需显式配置它们 ?
谢谢!
答案 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社区中添加该问题以进行改善。