Назад | Перейти на главную страницу

Создание нескольких виртуальных машин Azure с помощью Terraform, вызывающих проблемы с диском ОС

Впервые задаю вопросы здесь.

Я пытаюсь создать несколько виртуальных машин Azure в терраформе, используя модули и функцию подсчета. Проблема, с которой я столкнулся, заключается в том, что когда дело доходит до создания диска ОС для второй виртуальной машины, возникает ошибка:

* azurerm_virtual_machine.vm.0: compute.VirtualMachinesClient#CreateOrUpdate:            
Failure sending request: StatusCode=0 -- Original Error: autorest/azure:     
Service  returned an error. Status=<nil> Code="PropertyChangeNotAllowed" 
Message="Changing   property 'osDisk.name' is not allowed."   
Target="osDisk.name"

Это почти как если бы он пытался использовать то же имя, что и диск ОС первой виртуальной машины. Кто-нибудь знает, как я могу это решить.

Вот мой код:

resource "azurerm_network_interface" "vm_nic" {
  name                      = "${var.hostname}-nic"
  location                  = "${var.location}"
  resource_group_name       = "${var.rg_name}"
  network_security_group_id = "${var.nsg_id}"
  count                     = "${var.vm_count}"

  ip_configuration {
    name                          = "${var.hostname}-ipconfig"
    subnet_id                     = "${var.subnet_id}"
    private_ip_address_allocation = "dynamic"
    public_ip_address_id          = "${azurerm_public_ip.vm_pip.*.id[count.index]}"
  }
}

resource "azurerm_public_ip" "vm_pip" {
  name                         = "${var.hostname}-pip-${random_id.namegen.hex}"
  location                     = "${var.location}"
  resource_group_name          = "${var.rg_name}"
  public_ip_address_allocation = "dynamic"
  count                        = "${var.vm_count}"
}

resource "azurerm_managed_disk" "managed_disk_data" {
  name                 = "${var.hostname}-${count.index + 1}-datadisk"
  location             = "${var.location}"
  resource_group_name  = "${var.rg_name}"
  storage_account_type = "Premium_LRS"
  create_option        = "Empty"
  disk_size_gb         = "${var.data_disk_size}"
  count                = "${var.vm_count}"
}

resource "azurerm_virtual_machine" "vm" {
  name                  = "${var.hostname}-${count.index + 1}"
  location              = "${var.location}"
  resource_group_name   = "${var.rg_name}"
  network_interface_ids = ["${azurerm_network_interface.vm_nic.*.id[count.index]}"]
  vm_size               = "${var.vm_size}"
  depends_on            = ["azurerm_public_ip.vm_pip"]
  count                 = "${var.vm_count}"

  # Uncomment this line to delete the OS disk automatically when deleting the VM
  delete_os_disk_on_termination = true

  # Uncomment this line to delete the data disks automatically when deleting the VM
  delete_data_disks_on_termination = true

  storage_image_reference {
    id = "/subscriptions/xxxx/resourceGroups/rg-shared/providers/Microsoft.Compute/images/xx-image-xx"
  }

  storage_os_disk {
    name              = "myosdisk1${count.index}"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Premium_LRS"
  }

  # Optional data disks

  storage_data_disk {
    name            = "${azurerm_managed_disk.managed_disk_data.*.name[count.index]}"
    managed_disk_id = "${azurerm_managed_disk.managed_disk_data.*.id[count.index]}"
    create_option   = "Attach"
    lun             = 0
    disk_size_gb    = "${azurerm_managed_disk.managed_disk_data.*.disk_size_gb[count.index]}"
  }

Огромное спасибо

Что-то вроде этого вы и хотите:

resource "azurerm_virtual_machine" "server" {
  name                  = "server-${count.index}"
  count                 = "${var.instance_count}"
  …
  storage_os_disk {
    name              = "server-${count.index}-os"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }
}

… Но похоже, что это то, что вы уже делаете…

* azurerm_virtual_machine.vm.0: compute.VirtualMachinesClient#CreateOrUpdate:            
Failure sending request: StatusCode=0 -- Original Error: autorest/azure:     
Service  returned an error. Status=<nil> Code="PropertyChangeNotAllowed" 
Message="Changing   property 'osDisk.name' is not allowed."   
Target="osDisk.name"

в .0 указывает, что это ошибка на вашей первой виртуальной машине.

Вы изначально применили, затем изменили код вокруг имени диска, а затем попытались применить снова? Сначала удалите старые ресурсы. (спасибо @QuentinMoss)

РЕДАКТИРОВАТЬ: эта проблема с терраформой может относиться к вам: https://github.com/terraform-providers/terraform-provider-azurerm/issues/956