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

Terraform动态创建资源:复用配置创建Linux与Windows虚拟机

实现Terraform同时创建Linux和Windows虚拟机并复用配置

由于Terraform无法动态指定资源类型(比如根据变量切换azurerm_linux_virtual_machine和azurerm_windows_virtual_machine),我们可以通过参数复用+条件创建的方式实现需求,以下是两种可行方案:

方案一:灵活多实例配置(推荐)

通过定义包含VM类型的实例列表变量,用for_each过滤类型,分别创建Linux和Windows虚拟机,最大化复用公共配置。

1. 定义实例列表变量

在variables.tf中添加:

variable "vm_instances" {
  type = list(object({
    name        = string
    type        = string # 取值为"linux"或"windows"
    size        = string
    admin_user  = string
    admin_pass  = string
    nic_id      = string
  }))
  description = "需要创建的虚拟机实例列表,包含类型、配置信息"
}

2. 复用配置创建Linux虚拟机

修改原有Linux资源块,通过for_each遍历过滤出Linux类型的实例:

resource "azurerm_linux_virtual_machine" "this" {
  for_each = { for vm in var.vm_instances : vm.name => vm if vm.type == "linux" }

  name                            = each.value.name
  location                        = azurerm_resource_group.rg.location
  resource_group_name             = azurerm_resource_group.rg.name
  network_interface_ids           = [each.value.nic_id]
  size                            = each.value.size
  admin_username                  = each.value.admin_user
  admin_password                  = each.value.admin_pass
  disable_password_authentication = false

  # 保留你原有Linux虚拟机的其他配置...
}

3. 同步创建Windows虚拟机

新增Windows资源块,复用相同的公共参数,仅保留Windows特有的配置:

resource "azurerm_windows_virtual_machine" "this" {
  for_each = { for vm in var.vm_instances : vm.name => vm if vm.type == "windows" }

  name                            = each.value.name
  location                        = azurerm_resource_group.rg.location
  resource_group_name             = azurerm_resource_group.rg.name
  network_interface_ids           = [each.value.nic_id]
  size                            = each.value.size
  admin_username                  = each.value.admin_user
  admin_password                  = each.value.admin_pass

  # Windows特有的配置(示例)
  enable_automatic_upgrades = true
  provision_vm_agent        = true
}

4. 配置实例参数

在terraform.tfvars中添加要创建的VM实例:

vm_instances = [
  {
    name        = "linux-vm-01"
    type        = "linux"
    size        = "Standard_D2s_v3"
    admin_user  = "linux-admin"
    admin_pass  = "L!nuxP@ss123"
    nic_id      = azurerm_network_interface.linux_nic.id
  },
  {
    name        = "windows-vm-01"
    type        = "windows"
    size        = "Standard_D2s_v3"
    admin_user  = "win-admin"
    admin_pass  = "W!nP@ss123"
    nic_id      = azurerm_network_interface.windows_nic.id
  }
]

方案二:单实例开关配置

如果只需要创建各一台Linux/Windows虚拟机,可以通过布尔变量控制是否创建,复用公共变量:

1. 定义开关变量

variable "create_linux_vm" {
  type    = bool
  default = true
}

variable "create_windows_vm" {
  type    = bool
  default = true
}

# 公共配置变量
variable "vm_size" {
  type    = string
  default = "Standard_D2s_v3"
}

variable "admin_user" {
  type    = string
  default = "admin-user"
}

variable "admin_pass" {
  type    = string
  default = "P@$$w0rd123"
}

2. 条件创建Linux虚拟机

resource "azurerm_linux_virtual_machine" "this" {
  count = var.create_linux_vm ? 1 : 0

  name                            = "linux-vm"
  location                        = azurerm_resource_group.rg.location
  resource_group_name             = azurerm_resource_group.rg.name
  network_interface_ids           = [azurerm_network_interface.linux_nic.id]
  size                            = var.vm_size
  admin_username                  = var.admin_user
  admin_password                  = var.admin_pass
  disable_password_authentication = false

  # 原有Linux配置...
}

3. 条件创建Windows虚拟机

resource "azurerm_windows_virtual_machine" "this" {
  count = var.create_windows_vm ? 1 : 0

  name                            = "windows-vm"
  location                        = azurerm_resource_group.rg.location
  resource_group_name             = azurerm_resource_group.rg.name
  network_interface_ids           = [azurerm_network_interface.windows_nic.id]
  size                            = var.vm_size
  admin_username                  = var.admin_user
  admin_password                  = var.admin_pass

  # Windows特有配置...
}

内容的提问来源于stack exchange,提问作者Fr0zt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:35:11