Terraform создает VM из образа управляемого диска, сделанного в Packer
Я создал собственный образ виртуальной машины с помощью Packer, и теперь я пытаюсь создать новую виртуальную машину на основе этого образа с помощью Terraform, но я не совсем понимаю, как мне настроить файл.TF. Я могу создать остальную часть инфраструктуры в порядке.
Я думаю, что мой json-файл упаковщика создал образ управляемого диска, но я не уверен, как это настроить, и не могу найти пример в Интернете.
Я совершенно новичок в области инфраструктуры, как кода и системы эко Azure в целом.
main.tf
resource "azurerm_managed_disk" "managedDisk" {
name = "managed_disk_test1"
location = "northeurope"
resource_group_name = "${azurerm_resource_group.packer.name}"
storage_account_type = "Standard_LRS"
create_option = "FromImage"
image_reference_id = "/subscriptions/33efe2dc-e7a0-4fb8-827d-8be939879420/resourceGroups/packerRG/providers/Microsoft.Compute/images/myPackerImage"
disk_size_gb = "1"
}
resource "azurerm_virtual_machine" "PackerVm_TEST" {
name = "${var.hostname}"
location = "northeurope"
resource_group_name = "${azurerm_resource_group.packer.name}"
network_interface_ids = ["${azurerm_network_interface.packerNetInt_Test.id}"]
vm_size = "Standard_D2s_v3"
storage_os_disk {
name = "FromPackerImageOsDisk"
managed_disk_type = "Standard_LRS"
caching = "ReadWrite"
create_option = "FromImage"
}
os_profile {
computer_name = "PackerVmTEST"
admin_username = "packermakeradmin1"
admin_password = "RMKRTest123"
}
os_profile_windows_config {
enable_automatic_upgrades = "true"
provision_vm_agent ="true"
}
}
packer.json
{
"builders": [{
"type": "azure-arm",
"client_id": "",
"client_secret": "",
"tenant_id": "",
"subscription_id": "",
"object_id": "",
"managed_image_resource_group_name": "packerRG",
"managed_image_name": "myPackerImage",
"os_type": "Windows",
"image_publisher": "MicrosoftWindowsServer",
"image_offer": "WindowsServer",
"image_sku": "2016-Datacenter",
"communicator": "winrm",
"winrm_use_ssl": "true",
"winrm_insecure": "true",
"winrm_timeout": "3m",
"winrm_username": "packer",
"azure_tags": {
"dept": "Engineering",
"task": "Image deployment"
},
"location": "northeurope",
"vm_size": "Standard_DS2_v2"
}],
"provisioners": [{
"type": "powershell",
"inline": [
"Add-WindowsFeature Web-Server",
"if( Test-Path $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml ){ rm $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml -Force}",
"& $Env:SystemRoot\\System32\\Sysprep\\Sysprep.exe /oobe /generalize /shutdown /quiet"
]
}]
}
Вывод, когда я запускаю терраформ применить
* azurerm_virtual_machine.PackerVm_TEST: compute.VirtualMachinesClient#CreateOrUpdate: Failure responding to request: StatusCode=400 -- Original Error: autorest/azure: Service returned an error. Status=400 Code="InvalidParameter" Message="Cannot specify user ima
ge overrides for a disk already defined in the specified image reference."
1 ответ
Существует два способа подключения управляемого диска к виртуальной машине.
Либо вы удаляете ресурс azure_managed_disk, и вы указываете ссылку на изображение в ресурсе azurerm_virtual_machine. Управляемый диск будет автоматически создан и подключен к виртуальной машине.
resource "azurerm_virtual_machine" "PackerVm_TEST" {
name = "${var.hostname}"
location = "northeurope"
resource_group_name = "${azurerm_resource_group.packer.name}"
network_interface_ids = ["${azurerm_network_interface.packerNetInt_Test.id}"]
vm_size = "Standard_D2s_v3"
storage_os_disk {
name = "FromPackerImageOsDisk"
managed_disk_type = "Standard_LRS"
caching = "ReadWrite"
create_option = "FromImage"
}
storage_image_reference {
id = "/subscriptions/33efe2dc-e7a0-4fb8-827d-8be939879420/resourceGroups/packerRG/providers/Microsoft.Compute/images/myPackerImage"
}
os_profile {
computer_name = "PackerVmTEST"
admin_username = "packermakeradmin1"
admin_password = "RMKRTest123"
}
os_profile_windows_config {
enable_automatic_upgrades = "true"
provision_vm_agent ="true"
}
}
Или вы добавляете идентификатор управляемого диска в ресурс Azurerm_virtual_machine.
resource "azurerm_managed_disk" "managedDisk" {
name = "managed_disk_test1"
location = "northeurope"
resource_group_name = "${azurerm_resource_group.packer.name}"
storage_account_type = "Standard_LRS"
create_option = "FromImage"
image_reference_id = "/subscriptions/33efe2dc-e7a0-4fb8-827d-8be939879420/resourceGroups/packerRG/providers/Microsoft.Compute/images/myPackerImage"
disk_size_gb = "1"
}
resource "azurerm_virtual_machine" "PackerVm_TEST" {
name = "${var.hostname}"
location = "northeurope"
resource_group_name = "${azurerm_resource_group.packer.name}"
network_interface_ids = ["${azurerm_network_interface.packerNetInt_Test.id}"]
vm_size = "Standard_D2s_v3"
storage_os_disk {
name = "FromPackerImageOsDisk"
managed_disk_id = "${azurerm_managed_disk.managedDisk.id}"
managed_disk_type = "Standard_LRS"
caching = "ReadWrite"
create_option = "Attach"
}
os_profile {
computer_name = "PackerVmTEST"
admin_username = "packermakeradmin1"
admin_password = "RMKRTest123"
}
os_profile_windows_config {
enable_automatic_upgrades = "true"
provision_vm_agent ="true"
}
}
Из терраформной документации
managed_disk_id - (Необязательно) Указывает существующий управляемый диск для использования по идентификатору. Может использоваться только когда create_option это Attach.
Я добавил приведенный ниже код в файл.TF, и он работает нормально. Спасибо за помощь!
storage_image_reference {
id = "/subscriptions/33efe2dc-e7a0-4fb8-827d-8be939879420/resourceGroups/packerRG/providers/Microsoft.Compute/images/myPackerImage"
}