Samoht Rusconi
Samoht Rusconi

Reputation: 75

create azure vm from custom image using terraform error

I need to provision a VMs in Azure from a Custom Image using Terraform, and everything works fine with image from the market place but when I try to specify a my custom image an error returns. I have been banging my head all day on this issue. Here my tf script:

 resource "azurerm_windows_virtual_machine" "tftest" {
  name                  = "myazurevm"  
  location              = "eastus"
  resource_group_name   = "myresource-rg"
  network_interface_ids = [azurerm_network_interface.azvm1nic.id]
  size               = "Standard_B1s"

  storage_image_reference {
    id = "/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx/resourceGroups/xxxxx/providers/Microsoft.Compute/images/mytemplate"
  }

  storage_os_disk {
    name              = "my-os-disk"
    create_option     = "FromImage"
    managed_disk_type = "Premium_LRS"
  }

  storage_data_disk {
    name              = "my-data-disk"
    managed_disk_type = "Premium_LRS"
    disk_size_gb      = 75
    create_option     = "FromImage"
    lun               = 0
  }

  os_profile {
    computer_name  = "myvmazure"
    admin_username = "admin"
    admin_password = "test123"
  }

  os_profile_windows_config {
      provision_vm_agent = true
  }
} 

Here the error returned during plan phase:

2020-07-17T20:02:26.9367986Z ==============================================================================
2020-07-17T20:02:26.9368212Z Task         : Terraform
2020-07-17T20:02:26.9368456Z Description  : Execute terraform commands to manage resources on AzureRM, Amazon Web Services(AWS) and Google Cloud Platform(GCP)
2020-07-17T20:02:26.9368678Z Version      : 0.0.142
2020-07-17T20:02:26.9368852Z Author       : Microsoft Corporation
2020-07-17T20:02:26.9369049Z Help         : [Learn more about this task](https://aka.ms/AA5j5pf)
2020-07-17T20:02:26.9369262Z ==============================================================================
2020-07-17T20:02:27.2826725Z [command]D:\agent\_work\_tool\terraform\0.12.3\x64\terraform.exe providers
2020-07-17T20:02:27.5303002Z .
2020-07-17T20:02:27.5304176Z └── provider.azurerm
2020-07-17T20:02:27.5304628Z 
2020-07-17T20:02:27.5363313Z [command]D:\agent\_work\_tool\terraform\0.12.3\x64\terraform.exe plan
2020-07-17T20:02:29.7685150Z [31m
2020-07-17T20:02:29.7788471Z [1m[31mError: [0m[0m[1mInsufficient os_disk blocks[0m
2020-07-17T20:02:29.7792789Z 
2020-07-17T20:02:29.7793007Z [0m  on  line 0:
2020-07-17T20:02:29.7793199Z   (source code not available)
2020-07-17T20:02:29.7793305Z 
2020-07-17T20:02:29.7793472Z At least 1 "os_disk" blocks are required.
2020-07-17T20:02:29.7793660Z [0m[0m
2020-07-17T20:02:29.7793800Z [31m
2020-07-17T20:02:29.7793975Z [1m[31mError: [0m[0m[1mMissing required argument[0m

Do you have any suggestions to locate the issue?

Upvotes: 0

Views: 5306

Answers (3)

Regnawlle
Regnawlle

Reputation: 11

You can use a custom image with "azurerm_windows_virtual_machine" module setting "source_image_id" parameter.

Documentation note that :

One of either source_image_id or source_image_reference must be set.

One you can use for marketplace/gallery images and the other for managed images.

Here is an example of how to use source_image_id :

resource "azurerm_windows_virtual_machine" "vm_name" {
  name = "vm_name"
  resource_group_name = "my_rg"
  location = "westeurope"
  size = "Standard_B2s"

  os_disk {
    caching = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_id = "/subscriptions/<YourSubscriptionId>/resourceGroups/<YourImageResourceGroupName>/providers/Microsoft.Compute/images/<YourImageName>.vhd"
}

I suggest you don't use windows_virtual_machine as its maintenance is discontinued as stated in their documentation :

The azurerm_virtual_machine resource has been superseded by the azurerm_linux_virtual_machine and azurerm_windows_virtual_machine resources. The existing azurerm_virtual_machine resource will continue to be available throughout the 3.x releases however is in a feature-frozen state to maintain compatibility - new functionality will instead be added to the azurerm_linux_virtual_machine and azurerm_windows_virtual_machine resources.

References :
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/windows_virtual_machine#source_image_id
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_machine.html

Upvotes: 1

Marcio
Marcio

Reputation: 11

first do it https://learn.microsoft.com/pt-br/azure/virtual-machines/windows/upload-generalized-managed?toc=%2Fazure%2Fvirtual-machines%2Fwindows%2Ftoc.json

than my all cod

    resource "azurerm_resource_group" "example" {
  name     = "example-resources1"
  location = "West Europe"
}

resource "azurerm_virtual_network" "example" {
  name                = "example-network1"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_subnet" "example" {
  name                 = "internal1"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.2.0/24"]
}

resource "azurerm_network_interface" "example" {
  name                = "example-nic1"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  ip_configuration {
    name                          = "internal1"
    subnet_id                     = azurerm_subnet.example.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_virtual_machine" "example" {
  name                = "example-machine1"
  resource_group_name = azurerm_resource_group.example.name
  location            = azurerm_resource_group.example.location
  vm_size                = "Standard_B1s"
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  storage_image_reference {
    id = "/subscriptions/XXXXXXXXXXXXX/resourceGroups/ORIGEM/providers/Microsoft.Compute/images/myImage"

//just copi id from your image that you created
  }

  storage_os_disk {
    name              = "my-os-disk"
    create_option     = "FromImage"
    managed_disk_type = "Premium_LRS"
  }

  os_profile {
    computer_name  = "myvmazure"
    admin_username = "adminusername"
    admin_password = "testenovo@123"
  }

    os_profile_windows_config {
      provision_vm_agent = true
  }


  
}

//bellow the cod to call powershell o work extension,



resource "azurerm_virtual_machine_extension" "software" {
  name                 = "install-software"
  //resource_group_name  = azurerm_resource_group.example.name
  virtual_machine_id   = azurerm_virtual_machine.example.id
  publisher            = "Microsoft.Compute"
  type                 = "CustomScriptExtension"
  type_handler_version = "1.9"

  protected_settings = <<SETTINGS
  {

    "commandToExecute": "powershell -encodedCommand ${textencodebase64(file("install.ps1"), "UTF-16LE")}"

 
  }
  SETTINGS
}

Upvotes: 0

Samoht Rusconi
Samoht Rusconi

Reputation: 75

I have finally figured out the issue. I was using the wrong terraform resource:

wrong --> azurerm_windows_virtual_machine

correct -->  azurerm_virtual_machine

azurerm_windows_virtual_machine doesn't support arguments like (storage_os_disk, storage_data_disk) and is not the right one for custom images unless the image is publish in Shared Image Gallery.

See documentation for options supported from each provider: https://www.terraform.io/docs/providers/azurerm/r/virtual_machine.html https://www.terraform.io/docs/providers/azurerm/r/windows_virtual_machine.html

Upvotes: 3

Related Questions