Terraform Azure: создайте виртуальную машину Linux из образа упаковщика и внешнего диска с данными

Я пытался, но безрезультатно, Terraform выполнить следующие настройки в Azure:

Виртуальная машина Linux из созданного Packer пользовательского образа виртуальной машины с дополнительным постоянным, управляемым и зашифрованным диском данных, подключенным к указанной виртуальной машине, но работающим извне, если я хочу воссоздать виртуальную машину с более новой (более обновленной, безопасной) версией пользовательского изображение без потери данных, сохраненных на внешнем диске (представьте себе узел в кластере базы данных). И продолжал делать следующее:

  1. Сначала я попытался использовать azurerm_managed_disk и azurerm_virtual_machine_data_disk_attachment с ресурсом VM, но проблема в том, что если вы просто создаете диск, как это (с create_option установлен в Empty) диск будет неформатированным, не размеченным и не размонтированным. В основном непригоден, если на виртуальной машине не запущен какой-либо сценарий.
  2. Мое мышление пошло: хорошо, я просто бегу cloud-init или провайдер блокирует штуку, чтобы разделить / смонтировать диск и все. Но: если я сделаю это, когда я поверну виртуальную машину, скрипт снова запустится и переформатирует / разделит диск, следовательно, удалив все данные, которые я мог сохранить.
  3. Я также попытался создать собственный образ с дополнительным диском данных с помощью Packer и использовать FromImage в azurerm_managed_disk"s create_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}"
    }

    ...
}
Другие вопросы по тегам