【问题标题】:Azure DSC Extension mounts data disk incorrectly on Windows VMAzure DSC 扩展在 Windows VM 上错误地装载数据磁盘
【发布时间】:2022-06-15 18:55:00
【问题描述】:

我正在使用 Terraform 来预配 Azure VM。除了安装数据磁盘的 Azure DSC 扩展外,一切似乎都运行良好。我向 DSC 提供以下详细信息以将两个数据磁盘挂载到 vm。

{ "AllocationUnitSize":"4", "驱动器号":"E", “标签”:“二进制文件”, “缓存”:“无”, "disk_size_gb":"32", “伦”:“0”, "managed_disk_type":"标准SSD_LRS", “write_accelerator_enabled”:“假” }

{ "AllocationUnitSize":"64", "驱动器号":"F", “标签”:“数据”, "缓存":"只读", "disk_size_gb":"256", “伦”:“1”, "managed_disk_type":"标准SSD_LRS", “write_accelerator_enabled”:“假” }

但是如果我在运行 DSC 后检查虚拟机上的磁盘,32GB 磁盘会得到 Drive letter F: Label Data, Allocation unit 64 which提供256GB数据盘。

data disks

如果我有两个以上的数据磁盘,则 DSC 会随机安装它们,并假设其他磁盘的详细信息。

以下是用于配置 DSC 扩展的 terraform 代码 sn-p,

resource azurerm_virtual_machine_extension "vm_extention" {
    lifecycle {
        ignore_changes                      = [ settings, protected_settings ]
    }
    name                                    = "DesireStateConfiguration"
    virtual_machine_id                      = var.vm_id
    publisher                               = "Microsoft.Powershell"
    type                                    = "DSC"
    type_handler_version                    = "2.80"

    auto_upgrade_minor_version              = false
    settings                                = <<SETTINGS
    {
        "wmfVersion"                        : "latest",
        "configuration": {
            "url"                           : "${var.DSC_config.url}",
            "script"                        : "${var.DSC_config.script}",
            "function"                      : "${var.DSC_config.function}"
        },

        "configurationArguments": {
            "DataDisks"                     : ${jsonencode( var.disk_configurations )},
            "mountDisks"                    : ${var.mountDisks}
        }
    }
SETTINGS
    protected_settings                      = <<PROTECTED_SETTINGS
    {
        "configurationUrlSasToken"          : "${var.sas_token}"
    }
PROTECTED_SETTINGS
}

仅供参考:如果我检查 terraform 状态文件,它会在我输入 DSC 时显示正确的信息,并且在我登录 VM 以检查磁盘安装详细信息之前似乎没有任何问题。

更新

我还注意到,当 LUN 编号未按顺序显示在门户 screenshot 上时,会发生此问题

我们使用磁盘编号来获取磁盘 ID 以传递给 DSC 脚本以进行磁盘装载,如下所示。

            foreach( $disk in $disks )
        {
            $lun = [int]$disk.Lun
            $query  = "SELECT Index FROM Win32_DiskDrive WHERE InterfaceType='SCSI' AND SCSILogicalUnit='" + $lun + "'"
            $diskId = ( Get-CimInstance -Query $query ).Index
            $partitionStyle  = ( Get-Disk -Number $diskId -ErrorAction Stop ).PartitionStyle

            if ( $partitionStyle -ieq "RAW" )
            {                  

                WaitForDisk "LUN_$lun"
                {
                    DiskId = [uint32]$diskId
                    RetryIntervalSec = 20
                    RetryCount = 7
                }
                Disk "LUN_$lun"
                {
                    DriveLetter        = $disk.DriveLetter
                    DiskId             = [uint32]$diskId
                    FSLabel            = $disk.Label
                    AllocationUnitSize = [float]$disk.AllocationUnitSize
                    DependsOn          = "[WaitForDisk]LUN_$lun"
                }
            } else { Write-Output "Disk is already mounted" }
        }

如果 LUN 编号在门户上以正确的顺序显示,则上述脚本可以正常工作并按预期安装磁盘。我正在使用 azurerm_virtual_machine_data_disk_attachment 挂载数据磁盘,但找不到任何控制 LUN 顺序的方法。

【问题讨论】:

  • 能否请您分享完整的代码,以便在我的环境中进行测试。
  • @RahulKumarShaw-MT 感谢您回复这个问题。我已经通过一些更新编辑了主要问题。

标签: azure terraform azure-virtual-machine terraform-provider-azure


【解决方案1】:

我设法使用磁盘 UniqueId 而不是磁盘号让它工作。以下是更新后的代码

 foreach( $disk in $disks )
    {
        $lun = [int]$disk.Lun
        $DiskInfo = Get-Disk | Where Location -Like "*LUN $LUN"                
        $DiskId = $DiskInfo.UniqueId
        $partitionStyle  = $DiskInfo.PartitionStyle

        if ( $partitionStyle -ieq "RAW" )
        { 
            WaitForDisk "LUN_$lun"
            {
                DiskId           = $DiskId
                DiskIdType       = 'UniqueId'
                RetryIntervalSec = 20
                RetryCount       = 7
            }
            Disk "LUN_$lun"
            {
                DriveLetter        = $disk.DriveLetter
                DiskId             = $DiskId
                DiskIdType         = 'UniqueId'
                FSLabel            = $disk.Label
                AllocationUnitSize = [float]$disk.AllocationUnitSize
                DependsOn          = "[WaitForDisk]LUN_$lun"
            }
        } else { Write-Output "Disk is already mounted" }
    }

【讨论】:

    猜你喜欢
    • 2018-07-11
    • 2018-09-28
    • 1970-01-01
    • 2020-07-19
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多