Azure Terraform从托管磁盘映像创建VM

Azure Terraform从托管磁盘映像创建VM,azure,terraform,Azure,Terraform,我希望将marketplace映像连接到托管磁盘,然后将此托管磁盘连接到带有Terraform的Azure虚拟机 这允许更改虚拟机配置,其中销毁和重建会使虚拟机保持原样 我发现有类似问题的人,但这些问题已经解决了,没有留下如何实现这一目标的例子 对于平台映像 data "azurerm_platform_image" "2016-Datacenter" { location = "West Europe" publisher = "MicrosoftWindowsServer" o

我希望将marketplace映像连接到托管磁盘,然后将此托管磁盘连接到带有Terraform的Azure虚拟机

这允许更改虚拟机配置,其中销毁和重建会使虚拟机保持原样

我发现有类似问题的人,但这些问题已经解决了,没有留下如何实现这一目标的例子

对于平台映像

data "azurerm_platform_image" "2016-Datacenter" {
  location  = "West Europe"
  publisher = "MicrosoftWindowsServer"
  offer     = "WindowsServer"
  sku       = "2016-Datacenter"
}
resource "azurerm_managed_disk" "Server-osdisk" {
  resource_group_name  = "rgroup"
  location             = "West Europe"
  create_option        = "FromImage"
  image_reference_id   = "${data.azurerm_platform_image.server2016.id}"
  disk_size_gb         = "127"
  name                 = "Server-osdisk"
  storage_account_type = "Standard_LRS"
}
使用平台映像创建托管磁盘

data "azurerm_platform_image" "2016-Datacenter" {
  location  = "West Europe"
  publisher = "MicrosoftWindowsServer"
  offer     = "WindowsServer"
  sku       = "2016-Datacenter"
}
resource "azurerm_managed_disk" "Server-osdisk" {
  resource_group_name  = "rgroup"
  location             = "West Europe"
  create_option        = "FromImage"
  image_reference_id   = "${data.azurerm_platform_image.server2016.id}"
  disk_size_gb         = "127"
  name                 = "Server-osdisk"
  storage_account_type = "Standard_LRS"
}
然后在
azurerm\u虚拟机中引用它

resource "azurerm_virtual_machine" "main" {
  # ...

  os_profile {
    computer_name  = "Server"
    admin_username = ""
    admin_password = ""
  }

  storage_os_disk {
    managed_disk_id = "${azurerm_managed_disk.Server-osdisk.id}"

    # os_type           = "Windows"
    managed_disk_type = "Premium_LRS"
    caching           = "ReadWrite"
    create_option     = "Attach"
    name              = "Server"
  }
}
投掷

Status=400 Code=“InvalidParameter”Message=“必需参数 缺少“osDisk.osType”(null)。“Target=“osDisk.osType”

如果您在其中添加了
os\u type
,它会提示您不能拥有计算机名、用户名和密码所需的
os\u配置文件

有同样问题的人

尝试解决方案,但出现上述错误


我在这个问题上遗漏了什么?

关于你的问题,我已经尝试过了。你把事情变成你自己的,这只是一个例子。文件位于此处:

resource "azurerm_resource_group" "main" {
  name = "acctestRG"
  location = "West Europe"
}

data "azurerm_platform_image" "linux" {
  location  = "West Europe"
  publisher = "Canonical"
  offer     = "UbuntuServer"
  sku       = "16.04-LTS"
}

resource "azurerm_managed_disk" "source" {
  name = "acctestmd1"
  location = "West Europe"
  resource_group_name = "${azurerm_resource_group.main.name}"
  storage_account_type = "Standard_LRS"
  create_option = "FromImage"
  image_reference_id = "${data.azurerm_platform_image.linux.id}"

  tags {
    environment = "staging"
  }
}

resource "azurerm_virtual_network" "main" {
  name                = "azuretestvnet"
  address_space       = ["10.0.0.0/16"]
  location            = "${azurerm_resource_group.main.location}"
  resource_group_name = "${azurerm_resource_group.main.name}"
}

resource "azurerm_subnet" "internal" {
  name                 = "internal"
  resource_group_name  = "${azurerm_resource_group.main.name}"
  virtual_network_name = "${azurerm_virtual_network.main.name}"
  address_prefix       = "10.0.2.0/24"
}

resource "azurerm_network_interface" "main" {
  name                = "azuretestnic"
  location            = "${azurerm_resource_group.main.location}"
  resource_group_name = "${azurerm_resource_group.main.name}"

  ip_configuration {
    name                          = "testconfiguration1"
    subnet_id                     = "${azurerm_subnet.internal.id}"
    private_ip_address_allocation = "dynamic"
  }
}

resource "azurerm_virtual_machine" "main" {
  name  = "azurevm"
  location = "West Europe"
  resource_group_name = "${azurerm_resource_group.main.name}"
  network_interface_ids = ["${azurerm_network_interface.main.id}"]
  vm_size = "Standard_DS1_v2"


  storage_os_disk {
    os_type = "Linux"
    name = "acctestmd1"
    managed_disk_type = "Standard_LRS"
    caching           = "ReadWrite"
    create_option     = "Attach"
    managed_disk_id   = "${azurerm_managed_disk.source.id}"
  }
  os_profile_linux_config {
    disable_password_authentication = false
  }
}
我遇到了一些事情,我想你应该注意它们

  • VM中的托管磁盘类型和托管磁盘中的存储帐户类型应相同
  • 受管磁盘的名称在这两种情况下应相同

  • 希望这能对您有所帮助。

    对于您的问题,我会尝试一下。你把事情变成你自己的,这只是一个例子。文件位于此处:

    resource "azurerm_resource_group" "main" {
      name = "acctestRG"
      location = "West Europe"
    }
    
    data "azurerm_platform_image" "linux" {
      location  = "West Europe"
      publisher = "Canonical"
      offer     = "UbuntuServer"
      sku       = "16.04-LTS"
    }
    
    resource "azurerm_managed_disk" "source" {
      name = "acctestmd1"
      location = "West Europe"
      resource_group_name = "${azurerm_resource_group.main.name}"
      storage_account_type = "Standard_LRS"
      create_option = "FromImage"
      image_reference_id = "${data.azurerm_platform_image.linux.id}"
    
      tags {
        environment = "staging"
      }
    }
    
    resource "azurerm_virtual_network" "main" {
      name                = "azuretestvnet"
      address_space       = ["10.0.0.0/16"]
      location            = "${azurerm_resource_group.main.location}"
      resource_group_name = "${azurerm_resource_group.main.name}"
    }
    
    resource "azurerm_subnet" "internal" {
      name                 = "internal"
      resource_group_name  = "${azurerm_resource_group.main.name}"
      virtual_network_name = "${azurerm_virtual_network.main.name}"
      address_prefix       = "10.0.2.0/24"
    }
    
    resource "azurerm_network_interface" "main" {
      name                = "azuretestnic"
      location            = "${azurerm_resource_group.main.location}"
      resource_group_name = "${azurerm_resource_group.main.name}"
    
      ip_configuration {
        name                          = "testconfiguration1"
        subnet_id                     = "${azurerm_subnet.internal.id}"
        private_ip_address_allocation = "dynamic"
      }
    }
    
    resource "azurerm_virtual_machine" "main" {
      name  = "azurevm"
      location = "West Europe"
      resource_group_name = "${azurerm_resource_group.main.name}"
      network_interface_ids = ["${azurerm_network_interface.main.id}"]
      vm_size = "Standard_DS1_v2"
    
    
      storage_os_disk {
        os_type = "Linux"
        name = "acctestmd1"
        managed_disk_type = "Standard_LRS"
        caching           = "ReadWrite"
        create_option     = "Attach"
        managed_disk_id   = "${azurerm_managed_disk.source.id}"
      }
      os_profile_linux_config {
        disable_password_authentication = false
      }
    }
    
    我遇到了一些事情,我想你应该注意它们

  • VM中的托管磁盘类型和托管磁盘中的存储帐户类型应相同
  • 受管磁盘的名称在这两种情况下应相同

  • 希望这能对您有所帮助。

    您好,谢谢您花时间回复,我之前确实发现了磁盘大小,并对其进行了修改,更改了名称以保持不变,此设置的问题是您没有指定计算机名称,用户名和密码,因此Windows计算机是从映像创建的,但处于通用状态。您可以使用vm扩展为Windows vm设置用户,并确保其中安装的代理具有os\u配置文件\u Windows\u配置。对于Linux,可以使用ssh密钥。也许这是Terraform中的一个问题。你的意思是像
    os\u profile\u windows\u config{provision\u vm\u agent=true enable\u automatic\u upgrades=true additional\u unattend\u config{pass=“oobeSystem”component=“Microsoft windows Shell Setup”setting\u name=“autogon”content=“Passtrue1admin”}}
    或azurerm_virtual_machine_扩展资源是的,就是这样。好的,我将创建一个xml以绕过sysprep,并使用我提到的设置调用itHello,感谢您花时间响应,我确实在前面发现了磁盘大小,并进行了修改,更改了名称以保持不变,此安装程序的问题是,您没有指定计算机名、用户名和密码,因此Windows计算机是从映像创建的,但处于通用状态。您可以使用vm扩展为Windows vm设置用户,并确保其中安装的代理具有操作系统配置文件Windows配置文件。对于Linux,可以使用ssh密钥。也许这是Terraform中的一个问题。你的意思是像
    os\u profile\u windows\u config{provision\u vm\u agent=true enable\u automatic\u upgrades=true additional\u unattend\u config{pass=“oobeSystem”component=“Microsoft windows Shell Setup”setting\u name=“autogon”content=“Passtrue1admin”}}
    或azurerm\u虚拟机扩展资源是的,就是这样。好的,我将创建一个xml来绕过sysprep,并使用我提到的设置来调用它