我尝试使用 TFE 和基于共享图像库图像的托管磁盘创建虚拟机,但是在使用时:
storage_image_reference {
id = var.latest-image-id
}
storage_os_disk {
name = var.storage_os_disk_name
create_option = "FromImage"
managed_disk_type = var.managed_disk_type
disk_size_gb = var.disk_size_gb
os_type = var.os_type
}
磁盘不会进入该状态,因此无法使用新镜像进行更新
使用时:
resource "azurerm_managed_disk" "vmdisk" {
name = var.storage_os_disk_name
location = var.location
resource_group_name = var.resource_group_name
storage_account_type = var.managed_disk_type
create_option = "FromImage"
image_reference_id = var.latest-image-id
disk_size_gb = var.disk_size_gb
tags = var.common_tags
}
resource "azurerm_virtual_machine" "vm" {
storage_os_disk {
name = var.storage_os_disk_name
create_option = "Attach"
managed_disk_id = azurerm_managed_disk.vmdisk.id
}
此错误:
错误:创建/更新托管磁盘“1imutsbdsk0101”时出错(资源组“x-xxx-xxx-xxx-xx-xxx”):compute.DisksClient#CreateOrUpdate:发送请求失败:StatusCode=0 -- 原始错误: Code="InvalidParameter"Message="参数 imageReference 的值无效。"目标=“/订阅/xxxxxxxxxxxxxxxxxxxxxxxxxxx/resourceGroups/x-xxx-xxx-xx-xx-xxx/providers/Microsoft.Compute/gallery/xxxxxxx/images/xxxxx_Windows_2019_Mutable/versions/0.xx4.xxx”
我还没有看到这个问题的任何实际答案:
最佳答案
我在实验室中测试了相同的场景,错误对我来说也是相同的。
消息:参数 imageReference 的值无效。
根本原因:因为我们尝试从 SIG 镜像版本导出到磁盘,但使用了镜像上不存在的 LUN 位置。
当尝试从镜像版本创建托管磁盘时,我们得到的参数无效,因为两个资源正在使用的 LUN 编号不匹配。
解决方法:
默认情况下,在 Azure 中,每当我们从镜像版本创建 VM 时,都会使用托管磁盘创建它。
因此,我尝试使用共享镜像直接部署虚拟机,并且部署成功。
这是我的 main.tf
的一部分,用于部署虚拟机,我在其中定义了共享镜像版本位置,并在获取数据后将其用于虚拟机操作系统磁盘。
# Information about existing shared image version
data "azurerm_shared_image_version" "asgi" {
name = var.galleryImageVersionName
image_name = var.galleryImageDefinitionName
gallery_name = var.galleryName
resource_group_name = "the resource group where your shared Image Version is!!"
}
# Virtual Machine - Windows
resource "azurerm_windows_virtual_machine" "avm-01" {
name = local.vmName
computer_name = "myVm"
resource_group_name = azurerm_resource_group.arg-01.name # new resource group where we are creating all the resources using shared image gallery.
location = azurerm_resource_group.arg-01.location #same as the image version.
size = "Standard_A1"
admin_username = var.adminUsername
admin_password = var.adminPassword
network_interface_ids = [azurerm_network_interface.anic-01.id]
source_image_id = data.azurerm_shared_image_version.asgi.id
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
}
在 variables.tf
中,我定义了在 main.tf
文件中使用的变量。
provider "azurerm" {
features {}
subscription_id = var.tf_var_arm_subscription_id
}
variable "tf_var_arm_subscription_id" {
type = string
description = "Variable for our resource group"
}
variable "resourceGroupName" {
type = string
default = "tf-rg"
description = "Resource Group for this deployment."
}
variable "location" {
type = string
default = "West US 2"
description = "Enter the location for all resources."
}
variable "galleryName" {
type = string
description = "Name of the Shared Image Gallery."
}
variable "galleryImageDefinitionName" {
type = string
description = "Name of the Image Definition."
}
variable "galleryImageVersionName" {
type = string
}
我的 terraform.tfvars
文件包含我的订阅 ID 和所有共享图库资源名称。
tf_var_arm_subscription_id = "SubscriptionID"
# Defining values to the variables
galleryName = "mysharedgallery"
galleryImageDefinitionName = "my-image"
galleryImageVersionName = "0.0.1"
我还添加了其他设置,例如 vnet 等,我需要在 main.tf
中为我的虚拟机创建这些设置.
输出
注意:请为您的资源提供与共享图片库相同的区域。
关于azure - 使用共享图像库使用托管磁盘的 Terraform Azure VM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68379563/