Мне нужно указать количество виртуальных машин в Azure из пользовательского образа, используя Terraform. Образ довольно сложный, он определяет машину с 16 дисками данных, предварительно настроенными для работы с высокопроизводительной базой данных Oracle. Я предполагал, что мне не нужно настраивать блоки storage_data_disk
внутри ресурса azurerm_virtual_machine
, поскольку все диски уже настроены внутри образа.
Это казалось правдой. Если я создаю виртуальную машину, используя пользовательский storage_image_reference
- все диски с данными были созданы с правильными номерами 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 , как в исходной виртуальной машине, с которой был взят образ .
В конце концов, я решил это, добавив явные блоки storage_data_disk для каждого диска данных внутри ресурса azurerm_virtual_machine
, например:
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 все диски данных были созданы как Premium_SSD . Мне не нужно было их настраивать, и я даже не знал заранее, сколько дисков с данными было определено в образе или их размеры. Но когда я использую Terraform - все диски с данными создаются как Standard_HDD .
Есть ли способ сообщить провайдеру Terraform / Azure, какой тип диска использовать для виртуальных машин, предоставляемых из пользовательских образов без явной настройки каждого из них ?
Спасибо!