如何通过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
相关产品推荐
相关产品推荐

