0

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?

2

3 Answers 3

3

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

Sign up to request clarification or add additional context in comments.

1 Comment

This answer is now deprecated as azurerm_virtual_machine is not in feature-frozen. Now you can use the source_image_id parameter from azurerm_windows_virtual_machine
2

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

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
0

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
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.