问题描述
我能够在 Azure 上使用 terraform 成功部署 5 个数据磁盘,但是当我在门户中签入时,这些数据磁盘不是像 (lun3,lun1,lun0,lun2,lun4) 那样随机排序,但是当我使用 ARM 部署它们时模板,它们按顺序更新。
下面是我附加磁盘的代码
resource "azurerm_managed_disk" "disk" {
for_each = toset([for index in local.map : j.index])
name = ...
location = ...
resource_group_name = ...
storage_account_type = ...
create_option = "Empty"
disk_size_gb = ..
}
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
for_each = toset([for index in local.map : j.index])
lun = 0..n
managed_disk_id = azurerm_managed_disk.disk[each.key].id
virtual_machine_id = ...
caching = "None"
}
terraform plan
正在按顺序生成资源,但一旦部署完成,它们在 azure 门户中的填充顺序是随机的。我检查了文档 virtual_machine_data_disk_attachment 和 managed_disk,但它们不是用于这种顺序排序的标志/选项/属性。
我也检查了 az disk list
,但无法获得太多信息来解决这个问题。
有什么方法可以确保 terraform 生成和附加数据磁盘的顺序类似于 ARM 模板的做法,即按照 LUN 编号的顺序?
解决方法
这里有两个建议:
例如:
resource "azurerm_virtual_machine_data_disk_attachment" "managed_disk_attach" {
count = length(var.instances) * var.nb_disks_per_instance
managed_disk_id = azurerm_managed_disk.managed_disk.*.id[count.index]
virtual_machine_id = azurerm_linux_virtual_machine.vm.*.id[ceil((count.index + 1) * 1.0 / var.nb_disks_per_instance) - 1]
lun = count.index + 10
caching = "ReadWrite"
}
或者使用for_each
,你可以使用
locals {
vm_datadiskdisk_count_map = { for k in toset(var.instances) : k => var.nb_disks_per_instance }
luns = { for k in local.datadisk_lun_map : k.datadisk_name => k.lun }
datadisk_lun_map = flatten([
for vm_name,count in local.vm_datadiskdisk_count_map : [
for i in range(count) : {
datadisk_name = format("datadisk_%s_disk%02d",vm_name,i)
lun = i
}
]
])
}
resource "azurerm_managed_disk" "managed_disk" {
for_each = toset([for j in local.datadisk_lun_map : j.datadisk_name])
name = each.key
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
storage_account_type = "Standard_LRS"
create_option = "Empty"
disk_size_gb = 10
tags = var.tags
}
resource "azurerm_virtual_machine_data_disk_attachment" "managed_disk_attach" {
for_each = toset([for j in local.datadisk_lun_map : j.datadisk_name])
managed_disk_id = azurerm_managed_disk.managed_disk[each.key].id
virtual_machine_id = azurerm_linux_virtual_machine.vm[element(split("_",each.key),1)].id
lun = lookup(local.luns,each.key)
caching = "ReadWrite"
}