Terraform Azure: создайте виртуальную машину Linux из образа упаковщика и внешнего диска с данными
Я пытался, но безрезультатно, Terraform выполнить следующие настройки в Azure:
Виртуальная машина Linux из созданного Packer пользовательского образа виртуальной машины с дополнительным постоянным, управляемым и зашифрованным диском данных, подключенным к указанной виртуальной машине, но работающим извне, если я хочу воссоздать виртуальную машину с более новой (более обновленной, безопасной) версией пользовательского изображение без потери данных, сохраненных на внешнем диске (представьте себе узел в кластере базы данных). И продолжал делать следующее:
- Сначала я попытался использовать
azurerm_managed_disk
иazurerm_virtual_machine_data_disk_attachment
с ресурсом VM, но проблема в том, что если вы просто создаете диск, как это (сcreate_option
установлен вEmpty
) диск будет неформатированным, не размеченным и не размонтированным. В основном непригоден, если на виртуальной машине не запущен какой-либо сценарий. - Мое мышление пошло: хорошо, я просто бегу
cloud-init
или провайдер блокирует штуку, чтобы разделить / смонтировать диск и все. Но: если я сделаю это, когда я поверну виртуальную машину, скрипт снова запустится и переформатирует / разделит диск, следовательно, удалив все данные, которые я мог сохранить. - Я также попытался создать собственный образ с дополнительным диском данных с помощью Packer и использовать
FromImage
вazurerm_managed_disk
"screate_option
, но оказывается, что это работает только тогда, когда ссылки на изображения рынка и пользовательские изображения не поддерживаются
Единственная жизнеспособная вещь, о которой я могу сейчас думать, - это вернуться к 2
и создайте более умный скрипт, который будет работать, только если подключенный диск не разбит на разделы
Есть ли альтернативный подход, которого я не вижу? Может ли кто-нибудь помочь мне подтвердить это мышление?
Мое дополнительное беспокойство касается шифрования на указанных дисках, так как я не знаю, будет ли это проблемой при принятии любого из этих подходов.
1 ответ
Прежде всего, вы можете создать виртуальную машину Azure из настраиваемого образа через Terraform, независимо от того, как вы создаете образ, упаковщик или иным образом, более подробную информацию см. В разделе " Предоставление настраиваемого образа в Terraform".
Но когда вы используете пользовательский образ и хотите зашифровать диск с данными, проблема наступает.
В настоящее время шифрование диска не поддерживается при использовании пользовательских образов Linux.
Подробнее см. Требования и ограничения шифрования.
Кроме того, для подключения диска с данными к виртуальной машине, я думаю, вы можете использовать расширение виртуальной машины для достижения этой цели. И подключите диск с управляемыми данными к виртуальной машине, вы можете просто добавитьstorage_data_disk
блок в конфигурации виртуальной машины кода Terraform, например:
resource "azurerm_virtual_machine" "main" {
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_DS1_v2"
# Uncomment this line to delete the OS disk automatically when deleting the VM
# delete_os_disk_on_termination = true
# Uncomment this line to delete the data disks automatically when deleting the VM
# delete_data_disks_on_termination = true
...
storage_data_disk {
name = "datadisk0"
vhd_uri = "${azurestack_storage_account.test.primary_blob_endpoint}${azurestack_storage_container.test.name}/datadisk0.vhd"
disk_size_gb = "1023"
create_option = "Empty"
lun = 0
}
...
tags {
environment = "staging"
}
}
РЕДАКТИРОВАТЬ
Боюсь, вам нужно использовать пользовательский идентификатор изображения в vm storage_image_reference. Вы можете использовать данные azurerm_image для ссылки на ваше собственное изображение в вашей группе. Код как это:
data "azurerm_image" "custom" {
name = "your_custom_image_name"
resource_group_name = "your_group"
}
resource "azurerm_virtual_machine" "main" {
...
storage_image_reference {
id = "${data.azurerm_image.custom.id}"
}
...
}