Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PowerShell 调用阿里云 Cli 创建手动快照并重启实例 #143

Closed
Dream4ever opened this issue Apr 15, 2021 · 0 comments
Closed

PowerShell 调用阿里云 Cli 创建手动快照并重启实例 #143

Dream4ever opened this issue Apr 15, 2021 · 0 comments
Labels
Server The invisible hero

Comments

@Dream4ever
Copy link
Owner

Dream4ever commented Apr 15, 2021

需求描述

为了方便运维,便写了个 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 的计划任务中,每周定时运行即可。

@Dream4ever Dream4ever added the Server The invisible hero label Apr 15, 2021
@Dream4ever Dream4ever changed the title 调用阿里云 Cli 创建手动快照并重启实例 PowerShell 调用阿里云 Cli 创建手动快照并重启实例 Apr 15, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Server The invisible hero
Projects
None yet
Development

No branches or pull requests

1 participant