Ravindra
Ravindra

Reputation: 21

Getting error PropertyChangeNotAllowed while creating VM in Azure

I’m trying to create a VM in Azure using below config.

resource “azurerm_virtual_machine” “VM38” {
    name = “VM38”
    resource_group_name = data.azurerm_resource_group.myRG.name
    location = data.azurerm_resource_group.myRG.location
    vm_size = “Standard_F16s_v2”
    delete_os_disk_on_termination = true
    delete_data_disks_on_termination = true
    
    os_profile {
        computer_name = “vm38”
        admin_username = “adminuser”
        admin_password = “Password1234!”
        custom_data = base64encode(data.cloudinit_config.hybrid_vm38_cloudinit_cfg.rendered)
    }
    
    os_profile_linux_config {
        disable_password_authentication = false
    }
    
    storage_image_reference {
        id = data.azurerm_image.my_image.id
    }
    
    depends_on = [aws_instance.vm12]
    
    storage_os_disk {
        name = “VMDisk”
        create_option = “FromImage”
        caching = “ReadWrite”
        #disk_size_gb = 16
        #os_type = “Linux”
        #managed_disk_type = “Standard_LRS”
        vhd_uri = var.vmVHDURI
    }
    
    network_interface_ids = [azurerm_network_interface.mgmtNwIntf.id, azurerm_network_interface.transportNwIntf.id]
}

When I execute terraform apply I’m getting below error…

Error: compute.VirtualMachinesClient#CreateOrUpdate: Failure sending request: StatusCode=0 – Original Error: autorest/azure: Service returned an error. Status= Code=“PropertyChangeNotAllowed” Message=“Changing property ‘osDisk.name’ is not allowed.” Target=“osDisk.name”

with azurerm_virtual_machine.VM38, on az_virtual_machine.tf line 1, in resource “azurerm_virtual_machine” “VM38”: 1: resource “azurerm_virtual_machine” “VM38” {

Please let me know how to resolve this issue.

Terraform and Azure provider version details are given below: Terraform v1.0.8 on linux_amd64

Thanks & Regards, -Ravi

**In terraform.tfvars**
resourceGroupName   = "myResourceGroup"
deviceImageName     = "myDeviceImageName"

**In cloudinit_config.tf**
data "cloudinit_config" "hybrid_vm38_cloudinit_cfg" {
    gzip = false
    base64_encode = false
    depends_on = [aws_instance.hybrid_vm12]
    part {
        filename = "cloud-config"
        content_type = "text/cloud-config"
        content = file("cloudinit/vm38_cloud_config.yaml")
    }
    part {
        filename = "config-C8K.txt"
        content_type = "text/cloud-boothook"
        content = file("cloudinit/vm38_cloud_boothook.cfg")
    }
}

**In az_resource_group.tf**
data "azurerm_resource_group" "vm38RG" {
  name = var.resourceGroupName
}

**In az_image.tf**
data "azurerm_image" "deviceImage" {
  name = var.deviceImageName
  resource_group_name = data.azurerm_resource_group.vm38RG.name
}

**In az_virtual_network.tf**
resource "azurerm_virtual_network" "vm38VirtualNw" {
    name                = "vm38VirtualNw"
    address_space       = ["30.0.0.0/16"]
    location            = "eastus"
    resource_group_name = data.azurerm_resource_group.vm38RG.name

    tags = {
        environment = "My virtual network"
    }
}

**In az_subnet.tf**
resource "azurerm_subnet" "vm38MgmtSubnet" {
  name                 = "vm38MgmtSubnet"
  resource_group_name  = data.azurerm_resource_group.vm38RG.name
  virtual_network_name = azurerm_virtual_network.vm38VirtualNw.name
  address_prefixes     = ["30.0.11.0/24"]
}

resource "azurerm_subnet" "vm38TransportSubnet" {
  name                 = "vm38TransportSubnet"
  resource_group_name  = data.azurerm_resource_group.vm38RG.name
  virtual_network_name = azurerm_virtual_network.vm38VirtualNw.name
  address_prefixes     = ["30.0.12.0/24"]
}

**In az_network_interface.tf**
resource "azurerm_network_interface" "vm38MgmtNwIntf" {
  name                 = "vm38MgmtNwIntf"
  location             = data.azurerm_resource_group.vm38RG.location
  resource_group_name  = data.azurerm_resource_group.vm38RG.name
  ip_configuration {
    name                          = "vm38MgmtPvtIP"
    subnet_id                     = azurerm_subnet.vm38MgmtSubnet.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id = azurerm_public_ip.vm38MgmtPublicIP.id
  }
}

resource "azurerm_network_interface" "vm38TransportNwIntf" {
  name                 = "vm38TransportNwIntf"
  location             = data.azurerm_resource_group.vm38RG.location
  resource_group_name  = data.azurerm_resource_group.vm38RG.name

  ip_configuration {
    name                          = "vm38TransportPvtIP"
    subnet_id                     = azurerm_subnet.vm38TransportSubnet.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id = azurerm_public_ip.vm38TransportPublicIP.id
  }
}

**In az_virtual_machine.tf**
resource "azurerm_virtual_machine" "VM38" {
  name                = "VM38"
  resource_group_name = data.azurerm_resource_group.vm38RG.name
  location            = data.azurerm_resource_group.vm38RG.location
  vm_size             = "Standard_F16s_v2"
  delete_os_disk_on_termination = true
  #delete_data_disks_on_termination = true

  os_profile {
    computer_name   = "vm38"
    admin_username  = "adminuser"
    admin_password  = "Password1234!"
    custom_data     = base64encode(data.cloudinit_config.hybrid_vm38_cloudinit_cfg.rendered)
  }

  os_profile_linux_config {
    disable_password_authentication = false
  }

  storage_image_reference {
    id = data.azurerm_image.deviceImage.id
  }

  depends_on = [aws_instance.hybrid_vm12]
  
  storage_os_disk {
    name = "osDisk"
    create_option = "FromImage"
    caching              = "ReadWrite"
    #disk_size_gb = 16
    #os_type = "Linux"
    managed_disk_type = "Standard_LRS"
  }

  /*
  storage_data_disk {
    name = "vm38SecondaryDisk"
    caching = "ReadWrite"
    create_option = "Empty"
    disk_size_gb = 2048
    lun = 0
    managed_disk_type = "Premium_LRS"
  }
  */

  network_interface_ids = [
    azurerm_network_interface.vm38MgmtNwIntf.id,
    azurerm_network_interface.vm38TransportNwIntf.id
  ]
}

Upvotes: 0

Views: 2966

Answers (1)

Ansuman Bal
Ansuman Bal

Reputation: 11431

You can't change the os_disk name while creating the VM. It should be "osdisk" or something starting with that.

I tested using the below code:

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "ansuman-resources"
  location = "West US 2"
}

resource "azurerm_virtual_network" "example" {
  name                = "ansuman-network"
  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                 = "internal"
  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                = "ansuman-nic"
  location            = "${azurerm_resource_group.example.location}"
  resource_group_name = "${azurerm_resource_group.example.name}"

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

# we assume that this Custom Image already exists
data "azurerm_image" "custom" {
  name                = "ansumantestvm-image-20211007225625"
  resource_group_name = "resourcegroup"
}

resource "azurerm_virtual_machine" "example" {
  name                  = "ansuman-vm"
  location              = "${azurerm_resource_group.example.location}"
  resource_group_name   = "${azurerm_resource_group.example.name}"
  network_interface_ids = ["${azurerm_network_interface.example.id}"]
  vm_size               = "Standard_F2"

  # This means the OS Disk will be deleted when Terraform destroys the Virtual Machine
  # NOTE: This may not be optimal in all cases.
  delete_os_disk_on_termination = true

  storage_image_reference {
    id = "${data.azurerm_image.custom.id}"
  }

  storage_os_disk {
    name              = "osdisk"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }

  os_profile {
    computer_name  = "hostname"
    admin_username = "testadmin"
    admin_password = "Password1234!"
  }
  os_profile_windows_config {
  }
}

Output:

enter image description here

Note: Please make sure while creating the image from the original VM , first generalize it . If its not generalized then VM created from the custom image will get stuck in creating state and will not be able to boot up.


If you want to change the osdisk name to something of your choice then as a solution try creating the managed os disk first from the image using create option "copy" or "import" and then attach the disk while creating the VM as creating managed disk from custom image is also not supported ,it can be only done for platform image or marketplace image . You can refer this GitHub issue and this Github issue.

Reference terraform code for similar issue to give custom name to osdisk created from platform image/ market place image which Charles Xu has done in this SO thread.

Upvotes: 0

Related Questions