【问题标题】:LUN numbers not ordered when deployed through terraform通过 terraform 部署时未排序的 LUN 编号
【发布时间】:2021-04-26 21:59:12
【问题描述】:

我能够在 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_attachmentmanaged_disk 但它们不是这种顺序排序的标志/选项/属性。

我也检查了az disk list,但无法获得太多信息来解决这个问题。

有什么方法可以确保 terraform 生成和附加数据磁盘的顺序类似于 ARM 模板的操作方式,即按照 LUN 编号的顺序?

【问题讨论】:

  • 通过删除 managed_disk 和 disk_attach 解决了这个问题,并为 storage_disk 添加了一个动态标签

标签: azure terraform arm-template terraform-provider-azure azureportal


【解决方案1】:

这里有两个建议:

  1. 您可以考虑使用 Terraform 部署 ARM 模板。阅读this blog了解更多详情。
  2. 参考this blog中的示例,尝试使用countfor_each创建数据盘。

例如:

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"
}

【讨论】:

    猜你喜欢
    • 2020-07-01
    • 2022-11-19
    • 2021-01-19
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2014-05-08
    • 1970-01-01
    相关资源
    最近更新 更多