Terraform - запуск виртуальной машины Azure из моментального снимка
Я пытаюсь использовать Terraform для запуска виртуальной машины Azure (RM) с использованием ранее сделанного снимка в качестве диска ОС.
Вот что у меня есть.
data "azurerm_managed_disk" "windows-workstation_disk" {
name = "workstation-disk"
resource_group_name = "joeg"
}
## Workstation machine
resource "azurerm_virtual_machine" "windows-workstation" {
name = "windows-workstation"
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.rg.name}"
vm_size = "Standard_D2s_v3"
network_interface_ids = ["${azurerm_network_interface.windows-workstation_nic.id}"]
storage_os_disk {
name = "windows-workstation_osdisk"
managed_disk_id = "${data.azurerm_managed_disk.windows-workstation_disk.id}"
create_option = "Attach"
}
Я получаю следующую ошибку при запуске terraform apply
Error applying plan:
1 error(s) occurred:
* azurerm_virtual_machine.windows-workstation: Resource
'data.azurerm_managed_disk.windows-workstation_disk' not found for variable
'data.azurerm_managed_disk.windows-workstation_disk.id'
Есть идеи?
3 ответа
Azure не поддерживает создание виртуальной машины из моментального снимка. Этот моментальный снимок следует использовать для создания управляемого диска, а затем использовать этот управляемый диск для создания виртуальной машины. Смотрите эту ссылку.
Я тестирую в своей лаборатории, у меня работает следующий tf файл.
resource "azurerm_resource_group" "test" {
name = "shuicli"
location = "East US"
}
resource "azurerm_managed_disk" "source" {
name = "shuitest"
location = "East US"
resource_group_name = "shuicli"
storage_account_type = "Standard_LRS"
create_option = "Empty"
disk_size_gb = "30"
tags {
environment = "staging"
}
}
resource "azurerm_managed_disk" "copy" {
name = "shuicli"
location = "East US"
resource_group_name = "shuicli"
storage_account_type = "Standard_LRS"
create_option = "Copy"
source_resource_id = "<snapshot resource url>"
disk_size_gb = "32"
tags {
environment = "staging"
}
}
## Workstation machine
resource "azurerm_virtual_machine" "windows-workstation" {
name = "windows-workstation"
location = "East US"
resource_group_name = "shuicli"
vm_size = "Standard_D2s_v3"
network_interface_ids = ["${azurerm_network_interface.windows-workstation_nic.id}"]
storage_os_disk {
name = "shuitest"
os_type = "windows"
managed_disk_id = "${resource.azurerm_managed_disk.source.id}"
create_option = "Attach"
}
Чтобы использовать существующий моментальный снимок в Azure, сначала необходимо создать управляемый диск с идентификатором моментального снимка как source_resource_id:
resource "azurerm_managed_disk" "some_name" {
# option, copy and create a new disk from snapshot
create_option = "Copy"
# Snapshot ID
source_resource_id = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/your_resource_group/providers/Microsoft.Compute/snapshots/my_snapshot"
<other_parameters...>
}
Эти 2 статьи из "Andrade, Thiago" на Medium объяснят каждый этап этой задачи:
- создание моментального снимка диска: https://medium.com/@andrade.th/snapshot-azure-with-shell-script-snapshot-azure-com-shell-script-40ade2bee4fe
- создание виртуальной машины с использованием моментального снимка: https://medium.com/@andrade.th/new-vm-azure-with-snapshot-and-terraform-fa546d6135cf
Я работал над той же проблемой и сумел создать виртуальную машину из снимка. Сначала создайте снимок виртуальной машины в рамках той же подписки. Затем в своем TF-файле проигнорируйте указанный выше исходный диск и просто создайте диск-копию с путем к моментальному снимку, указанному в "source_resource_id", и присоедините его к новой виртуальной машине в качестве диска ОС. Ниже приведен пример, который я использовал. Также убедитесь, что ссылка на диск в "storage_os_disk" - это "azurerm_managed_disk.copy.id", а не "resource.azurerm_managed_disk.copy.id". Надеюсь это поможет!
resource "azurerm_managed_disk" "copy" {
name = "myOsDisk4"
location = "North Europe"
resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
storage_account_type = "Standard_LRS"
create_option = "Copy"
source_resource_id = "/subscriptions/*************/resourceGroups/My-prod-rg/providers/Microsoft.Compute/snapshots/test-01-c-drive"
disk_size_gb = "127"
tags {
environment = "Prod"
}
}
# Create virtual machine
resource "azurerm_virtual_machine" "myterraformvm" {
name = "Test-01"
location = "North Europe"
resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
network_interface_ids = ["${azurerm_network_interface.myterraformnic.id}"]
vm_size = "Standard_DS1_v2"
storage_os_disk {
name = "${azurerm_managed_disk.copy.name}"
os_type = "windows"
managed_disk_id = "${azurerm_managed_disk.copy.id}"
create_option = "Attach"