【发布时间】:2021-04-11 05:24:19
【问题描述】:
TF 版本:0.13.4
提供者版本:2.40.0
我不确定执行此操作的最佳/最有效方法,但我想要实现的是将 2 个磁盘(目前)附加到每个 VM,但我需要能够配置每个 VM和磁盘根据要求。我将来可能需要改变磁盘和虚拟机的数量。我试图让 for_each 循环遍历大小,并根据其中有多少值,创建该数量的磁盘,以便我可以拥有多个不同大小的磁盘。
有没有办法做到这一点而无需手动创建多个托管磁盘资源?
我当前的代码创建了不同数量的虚拟机,但每个虚拟机只附加一个磁盘。 for_each 迭代的变量在每个环境的 tfvars 文件中设置:
desktop_servers = {
"Server_1" = {
name = 1,
zone = 1,
lun = 1,
size = 32
}
"Server_2" = {
name = 2,
zone = 2,
lun = 2,
size = 32
}
"Server_3" = {
name = 3,
zone = 3,
lun = 3,
size = 32
}
}
etl_servers = {
"Server_1" = {
name = 1,
zone = 1,
lun = 1,
size = 32
}
"Server_2" = {
name = 2,
zone = 2,
lun = 2,
size = 32
}
}
module.tf中的虚拟机资源
# Azure Virtual Machine
resource "azurerm_windows_virtual_machine" "virtual_machine" {
for_each = var.servers
name = "vm-${var.environment}-${var.vm_identifier}${each.value.name}"
location = var.location
resource_group_name = var.resource_group
zone = each.value.zone
size = var.vm_size
network_interface_ids = [azurerm_network_interface.network_interface[each.key].id]
computer_name = "${var.vm_identifier}${each.value.name}"
admin_username = xxxx
admin_password = xxxx
provision_vm_agent = "true"
source_image_id = data.azurerm_shared_image.dwp_shared_image.id
boot_diagnostics {
storage_account_uri = data.azurerm_storage_account.dwp_diag_storage_account.primary_blob_endpoint
}
os_disk {
name = "vm-${var.environment}-${var.directorate}-${var.business_unit}-${var.vm_identifier}-os${each.value.name}"
caching = "ReadWrite"
storage_account_type = "Premium_LRS"
}
depends_on = [azurerm_network_interface.network_interface]
}
module.tf 中的托管磁盘资源:
# #Managed disks per vm
resource "azurerm_managed_disk" "managed_disk" {
for_each = var.servers
name = "disk-${var.environment}-${var.vm_identifier}${each.value.name}"
location = var.location
resource_group_name = var.resource_group
storage_account_type = "Premium_LRS"
create_option = "Empty"
disk_size_gb = each.value.size
zones = [azurerm_windows_virtual_machine.virtual_machine[each.key].zone]
}
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attachment" {
for_each = var.servers
managed_disk_id = azurerm_managed_disk.managed_disk[each.key].id
virtual_machine_id = azurerm_windows_virtual_machine.virtual_machine[each.key].id
lun = each.value.lun
caching = "ReadWrite"
}
模块内的variable.tf:
variable "servers" {
description = "Variable for defining each instance"
}
main.tf 中 ETL 服务器的模块示例。 :
module "etl_vm" {
source = "../modules/compute/windows_vm"
location = var.location
resource_group = azurerm_resource_group.rg_sbox_etl.name
directorate = var.directorate
business_unit = var.business_unit
environment = var.environment
network_rg_identifier = var.network_rg_identifier
subnet_name = "sub-${var.environment}-${var.directorate}-${var.business_unit}-be01"
diag_storage_account_name = var.diag_storage_account_name
log_analytics_workspace_name = var.log_analytics_workspace_name
backup_policy_name = var.backup_policy_name
vm_identifier = "${var.vm_identifier}${var.instance_number}-etl"
servers = var.etl_servers
vm_size = var.etl_vm_size
enable_management_locks = true
image_name = "WIN2016-CISL2"
gallery_subscription_id = var.sub_id
gallery_resourcegroup = var.rg_gallery
gallery_name = "SBOXGallery"
【问题讨论】:
-
var.servers与etl_servers和desktop_servers有什么关系?是不是这两个变量的联合图? -
我更新了我的代码以显示它们如何链接在一起。 `var.servers' 是模块中定义的输入变量。 'etl_servers' 在 tfvars 文件中定义并在模块中调用。
-
关于这个问题的任何更新?它解决了你的问题吗?
-
谢谢 - 我可以看到这将如何解决问题,从我运行的计划来看,它看起来不错。由于将 for_each 添加到调用模块,我遇到了嵌套提供程序的问题,但这是一个单独的问题
标签: azure azure-virtual-machine terraform-provider-azure