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
相关产品推荐
相关产品推荐

