You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform使用Azure社区镜像创建虚拟机?

如何通过Terraform使用Azure社区镜像创建虚拟机?

我之前也碰到过类似的困扰,Azure社区镜像的配置逻辑和官方Marketplace镜像确实有区别,Terraform文档里这块的说明比较隐晦,我来给你讲清楚怎么操作,顺便修正你代码里的问题。

核心关键点:用source_image_id替代常规的image_reference

社区镜像不属于Azure官方的标准化镜像,所以不能用image_reference(那种指定publisher、offer、sku的方式),而是需要直接指定镜像的资源ID,通过source_image_id参数来关联。

第一步:获取社区镜像的资源ID

你可以通过两种方式拿到这个ID:

  • Azure门户:找到你要使用的社区镜像,进入详情页后,点击「JSON视图」,复制id字段的值;
  • Azure CLI命令:
az sig image-version list --resource-group <你的镜像资源组名> --gallery-name <镜像库名> --image-definition <镜像定义名> --query "[0].id" -o tsv

第二步:修正你的Terraform代码

你的现有代码存在语法错误(比如network_interface的ip_configuration没闭合,VM代码也截断了),下面是完整的可运行示例,重点看虚拟机部分的source_image_id配置:

# 先定义资源组(如果已有可以跳过)
resource "azurerm_resource_group" "servers" {
  name     = "server-rg"
  location = "East US" # 注意要和镜像所在区域一致
}

# 定义虚拟网络和子网(如果已有可以跳过)
resource "azurerm_virtual_network" "servers_vnet" {
  name                = "server-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.servers.location
  resource_group_name = azurerm_resource_group.servers.name
}

resource "azurerm_subnet" "servers_subnet" {
  name                 = "server-subnet"
  resource_group_name  = azurerm_resource_group.servers.name
  virtual_network_name = azurerm_virtual_network.servers_vnet.name
  address_prefixes     = ["10.0.1.0/24"]
}

# 定义网络接口
resource "azurerm_network_interface" "VM_nic" {
  name                = "VM-nic"
  location            = azurerm_resource_group.servers.location
  resource_group_name = azurerm_resource_group.servers.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.servers_subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

# 用社区镜像创建Linux虚拟机
resource "azurerm_linux_virtual_machine" "BackBox_vm" {
  name                            = "BackBox"
  computer_name                   = "BackBox"
  resource_group_name             = azurerm_resource_group.servers.name
  location                        = azurerm_resource_group.servers.location
  size                            = "Standard_D2s_v3"
  admin_username                  = "adminuser"
  network_interface_ids           = [azurerm_network_interface.VM_nic.id]
  
  # 核心:指定社区镜像的资源ID
  source_image_id                 = "/subscriptions/xxx/resourceGroups/yyy/providers/Microsoft.Compute/galleries/zzz/images/backbox/versions/1.0.0"

  admin_ssh_key {
    username   = "adminuser"
    public_key = file("~/.ssh/id_rsa.pub")
  }

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Premium_LRS"
  }
}

注意事项

  • 确保Terraform使用的服务主体(或你的本地登录身份)拥有访问该社区镜像的权限,如果镜像在其他资源组,需要给身份添加「读者」或「计算镜像参与者」角色;
  • 虚拟机的区域必须和社区镜像的区域完全一致,跨区域无法直接使用;
  • 如果是Windows社区镜像,需要替换为azurerm_windows_virtual_machine资源,同时调整登录方式(比如用admin_password而不是SSH密钥)。

备注:内容来源于stack exchange,提问作者Whiplash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:24:48