gpt4 book ai didi

windows - 使用 Terraform、Chef 或 Powershell 以编程方式设置 EBS 卷 Windows 驱动器盘符

转载 作者:行者123 更新时间:2023-12-03 01:50:54 24 4
gpt4 key购买 nike

我正在使用 terraform 和 Chef 创建多个 aws ebs 卷并将它们附加到 EC2 实例。

问题是我希望能够为每个 ebs 卷指定一个特定的 Windows 驱动器号。问题是,当实例化 EC2 实例时,窗口只是为其提供连续的驱动器号(D、E、F 等)

一些驱动器大小相同,因此我不一定可以根据驱动器大小进行重命名。有谁知道如何用 terraform 或 Chef 来做到这一点。我的 google foo 没有找到任何东西。

当然,这一定会出现在其他人身上吗?

我确实看到了使用 EC2Config Windows GUI 来设置它们的引用,但重点是自动化该过程,因为最终我希望 Chef 安装 SQL Server,并且某些数据预计会存储在某些驱动器号上。

这似乎有效 - 尽管我确实想知道是否没有更简单的方法。

function Convert-SCSITargetIdToDeviceName
{
param([int]$SCSITargetId)
If ($SCSITargetId -eq 0) {
return "/dev/sda1"
}
$deviceName = "xvd"
If ($SCSITargetId -gt 25) {
$deviceName += [char](0x60 + [int]($SCSITargetId / 26))
}
$deviceName += [char](0x61 + $SCSITargetId % 26)
return $deviceName
}

Get-WmiObject -Class Win32_DiskDrive | ForEach-Object {
$DiskDrive = $_
$Volumes = Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='$($DiskDrive.DeviceID)'} WHERE AssocClass=Win32_DiskDriveToDiskPartition" | ForEach-Object {
$DiskPartition = $_
Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='$($DiskPartition.DeviceID)'} WHERE AssocClass=Win32_LogicalDiskToPartition"
}
If ($DiskDrive.PNPDeviceID -like "*PROD_PVDISK*") {
$BlockDeviceName = Convert-SCSITargetIdToDeviceName($DiskDrive.SCSITargetId)
If ($BlockDeviceName -eq "xvdf") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="D:"; Label="SQL Data"} };
If ($BlockDeviceName -eq "xvdg") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="L:"; Label="SQL Logs"} };
If ($BlockDeviceName -eq "xvdh") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="R:"; Label="Report Data"} };
If ($BlockDeviceName -eq "xvdi") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="T:"; Label="Temp DB"} };
If ($BlockDeviceName -eq "xvdj") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="M:"; Label="MSDTC"} };
If ($BlockDeviceName -eq "xvdk") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="B:"; Label="Backups"} };
} ElseIf ($DiskDrive.PNPDeviceID -like "*PROD_AMAZON_EC2_NVME*") {
$BlockDeviceName = Get-EC2InstanceMetadata "meta-data/block-device-mapping/ephemeral$($DiskDrive.SCSIPort - 2)"
If ($BlockDeviceName -eq "xvdf") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="D:"; Label="SQL Data"} };
If ($BlockDeviceName -eq "xvdg") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="L:"; Label="SQL Logs"} };
If ($BlockDeviceName -eq "xvdh") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="R:"; Label="Report Data"} };
If ($BlockDeviceName -eq "xvdi") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="T:"; Label="Temp DB"} };
If ($BlockDeviceName -eq "xvdj") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="M:"; Label="MSDTC"} };
If ($BlockDeviceName -eq "xvdk") { $drive = gwmi win32_volume -Filter "DriveLetter = '$($Volumes.DeviceID)'"; Set-WmiInstance -input $drive -Arguments @{DriveLetter="B:"; Label="Backups"} };
} Else {
write-host "Couldn't find disks";
}
}

最佳答案

我需要一个具有 4 个相同大小的驱动器的 Windows Server 2016,但我不关心哪个 block 设备成为哪个驱动器号。以下是我为获得此信息而采取的步骤(使用 Packer):

首先,在模板的构建器区域中,添加所需数量的 block 设备(在我的例子中 - launch_block_device_mapping 下有 4 个条目)。然后,在配置者列表中运行以下命令:

  1. 使用任何 Windows 2016 Amazon 实例上可用的脚本初始化磁盘;这将使每个磁盘联机,向其中添加一个分区,将分区扩展到最大可能的大小,对其进行格式化并为其分配一个 Windows 驱动器号。

    {
    "type": "powershell",
    "inline": [
    "C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeDisks.ps1"
    ]
    }

    注释:

    如果添加'-Schedule'参数,此时磁盘将不会初始化,因为此选项只会将脚本添加到计划在下次启动时运行一次的任务中实例的(之后它被停用)。

    驱动器号按字母顺序分配,从 D 开始(因为 C 是为根驱动器保留的)。

    卷附加到实例的顺序与 block 设备名称无关,并且不会具有一对一的对应关系(xvdb 不会成为D:\ 驱动器,xvdc 不会变成 E:\ 等)

  2. 为已初始化磁盘的每个驱动器号分配您想要的标签。

    {
    "type": "powershell",
    "inline": [
    "write-output \"Label partitions after initializing disks\"",
    "label C: \"OS\"",
    "label D: \"Programs\"",
    "label E: \"Data\"",
    "label F: \"Backup\"",
    ...
    ]
    }

    注意:另一种可能的选择是在运行磁盘初始化脚本之前直接在 DriveLetterMapping.json 文件(在任何 Windows 2016 Amazon AMI 上可用)中添加标签(我无法完成这项工作)。

  3. 添加您可能需要的任何其他配置程序(例如激活 Windows 组件、安装应用程序或检查 Windows 更新)后,作为配置程序列表中的最后一个条目,请确保添加实例初始化和 SysPrep 脚本

    {
    "type": "powershell",
    "inline": [
    "C:/ProgramData/Amazon/EC2-Windows/Launch/Scripts/InitializeInstance.ps1 -Schedule",
    "C:/ProgramData/Amazon/EC2-Windows/Launch/Scripts/SysprepInstance.ps1 -NoShutdown"
    ]
    }

    注意:最后一步特定于 EC2Launch,并从 Windows 2016 开始适用。对于旧版本(例如 Windows 2012),语法有所不同,并且基于 EC2Config。

从此配置获取 AMI 后,从此配置启动的任何实例的驱动器号都应符合要求。

如果驱动器号及其标签未按预期映射,您还可以尝试使用实例的用户数据强制重新标记驱动器。在启动它之前,可以轻松地以明文形式传递 powershell 脚本;下面只是一个可能的示例:

<powershell>
write-output "Force re-map of drive letters based on labels, after disk initialization"
# remove drive letters, but keep labels
Get-Volume -Drive D | Get-Partition | Remove-PartitionAccessPath -accesspath "D`:\"
Get-Volume -Drive E | Get-Partition | Remove-PartitionAccessPath -accesspath "E`:\"
Get-Volume -Drive F | Get-Partition | Remove-PartitionAccessPath -accesspath "F`:\"
# add drive letters based on labels
get-volume | where filesystemlabel -match "Programs" | Get-Partition | Set-Partition -NewDriveLetter D
get-volume | where filesystemlabel -match "Data" | Get-Partition | Set-Partition -NewDriveLetter E
get-volume | where filesystemlabel -match "Backup" | Get-Partition | Set-Partition -NewDriveLetter F
</powershell>

关于windows - 使用 Terraform、Chef 或 Powershell 以编程方式设置 EBS 卷 Windows 驱动器盘符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46921165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com