-
Notifications
You must be signed in to change notification settings - Fork 6
PowerShell 调用阿里云 Cli 创建手动快照并重启实例 #143
Copy link
Copy link
Closed
Labels
ServerThe invisible heroThe invisible hero
Description
需求描述
为了方便运维,便写了个 PowerShell 脚本,每周定时执行该脚本,来给阿里云服务器上的各块云盘创建手动快照,并在快照均创建完毕之后重启实例。
前期准备
关键代码
cls
# 在这里记录各云盘的 ID
$cDiskId = "d-****"
$dDiskId = "d-****"
$eDiskId = "d-****"
# 为各云盘创建快照的代码
# 利用字符串模板提高代码复用性
$cmdTemplate = "aliyun ecs CreateSnapshot --DiskId {0} --SnapshotName '{1}-Disk-Before-Reboot'"
$cDiskBackupCmd = $cmdTemplate -f $cDiskId, "C"
$dDiskBackupCmd = $cmdTemplate -f $dDiskId, "D"
$eDiskBackupCmd = $cmdTemplate -f $eDiskId, "E"
# 执行创建快照的操作,并获取命令执行后返回的快照 ID
$cSnapShotId = iex $cDiskBackupCmd
$cSnapShotId = $cSnapShotId[2] | ConvertFrom-String
$cSnapShotId = $cSnapShotId.P3 -replace '"',''
$dSnapShotId = iex $dDiskBackupCmd
$dSnapShotId = $dSnapShotId[2] | ConvertFrom-String
$dSnapShotId = $dSnapShotId.P3 -replace '"',''
$eSnapShotId = iex $eDiskBackupCmd
$eSnapShotId = $eSnapShotId[2] | ConvertFrom-String
$eSnapShotId = $eSnapShotId.P3 -replace '"',''
#Write-Host $("C 盘快照 ID:{0}" -f $cSnapShotId)
#Write-Host $("D 盘快照 ID:{0}" -f $dSnapShotId)
#Write-Host $("E 盘快照 ID:{0}" -f $eSnapShotId)
# 查询各云盘快照的代码
$snapshotQueryTemplate = "aliyun ecs DescribeSnapshots --RegionId cn-qingdao --DiskId {0} --SnapshotType user --output cols=SnapshotId,SnapshotName,Status rows=Snapshots.Snapshot[]"
$cDiskSnapshotsQueryCmd = $snapshotQueryTemplate -f $cDiskId
$dDiskSnapshotsQueryCmd = $snapshotQueryTemplate -f $dDiskId
$eDiskSnapshotsQueryCmd = $snapshotQueryTemplate -f $eDiskId
$stopFlag = $FALSE
while(!$stopFlag) {
# 每 20 秒查询一次各云盘快照
$cDiskSnapshots = iex $cDiskSnapshotsQueryCmd
$dDiskSnapshots = iex $dDiskSnapshotsQueryCmd
$eDiskSnapshots = iex $eDiskSnapshotsQueryCmd
$cSnapShotStatus = ""
$dSnapShotStatus = ""
$eSnapShotStatus = ""
# 在各云盘的快照列表中找到本次创建的快照,获取其状态
forEach ($cDiskSnapshot in $cDiskSnapshots) {
if ($cDiskSnapshot -match $cSnapShotId) {
$cSnapShotStatus = $cDiskSnapshot.Split(' | ')[-1]
#Write-Host $("C 盘快照状态: {0} {1}" -f $cSnapShotStatus,$(Get-Date))
}
}
forEach ($dDiskSnapshot in $dDiskSnapshots) {
if ($dDiskSnapshot -match $dSnapShotId) {
$dSnapShotStatus = $dDiskSnapshot.Split(' | ')[-1]
#Write-Host $("D 盘快照状态: {0} {1}" -f $dSnapShotStatus,$(Get-Date))
}
}
forEach ($eDiskSnapshot in $eDiskSnapshots) {
if ($eDiskSnapshot -match $eSnapShotId) {
$eSnapShotStatus = $eDiskSnapshot.Split(' | ')[-1]
#Write-Host $("E 盘快照状态: {0} {1}`n" -f $eSnapShotStatus,$(Get-Date))
}
}
# 如各云盘的快照均创建完成,则结束循环
if (($cSnapShotStatus -eq 'accomplished') -and ($dSnapShotStatus -eq 'accomplished') -and ($eSnapShotStatus -eq 'accomplished')) {
$stopFlag = $TRUE
Break
}
Start-Sleep -Seconds 20
}
#Write-Host "所有磁盘快照已创建成功!"
# 最后重启实例即可
$rebootCmd = "aliyun ecs RebootInstance --InstanceId i-****"
iex $rebootCmd
自动运行
脚本编写完成后,将其添加到 Windows 的计划任务中,每周定时运行即可。
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
ServerThe invisible heroThe invisible hero