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

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

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

  1. Первоначально я пытался использовать azurerm_managed_disk и azurerm_virtual_machine_data_disk_attachment с ресурсом виртуальной машины, но проблема в том, что если вы просто создаете на таком диске (с create_option, установленным на Empty) диск будет неформатированным, не разбитым на разделы и размонтированным.В основном непригоден, если на виртуальной машине не запущен какой-либо сценарий.
  2. Я подумал: хорошо, я просто запустил cloud-init или блок инициатора поставки для разбиения / монтирования диска и все.Но: если я сделаю это, когда я поверну виртуальную машину, скрипт снова запустится и переформатирует / разделит диск, следовательно, удалив все данные, которые я мог сохранить.
  3. Я также попытался создать собственный образ сдополнительный диск с данными с пакером, и с использованием FromImage в azurerm_managed_disk в create_option, но получается , он работает только при обращении к изображениям из торговой площадки и пользовательские изображения не поддерживаются

Единственная жизнеспособная вещь, о которой я могу подумать, - это вернуться к 2 и создать более умный сценарий, который запускается, только если подключенный диск не разбит на разделы.

Есть ли альтернативный подход, которого я не вижу?Может ли кто-нибудь помочь мне подтвердить это мнение?

Моя дополнительная проблема связана с шифрованием на указанных дисках, поскольку я не знаю, будет ли это проблемой при принятии любого из этих подходов.

1 Ответ

1 голос
/ 07 марта 2019

Прежде всего, вы можете создать виртуальную машину 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"
  }
}

EDIT

Боюсь, вам нужно использовать собственный идентификатор изображения в 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}"
    }

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...