如何通过XenServer PowerShell 脚本批量快照和制定定期快照任务

  XenServerPSModule是XenServer 在Windows PowerShell下运行的模块。XenServer基于Linux开发而来,因此在XenServer命令行中,常用ls、mount、df、fdisk的Linux命令都可以正常使用。除此之外,XenServer也有自己的命令行和命令书写规范,以“xe 、xe-、xen”开头运行的命令都是XenServer专用命令。XenServer SDK基于Windows PowerShell开发了适用于PowerShell的XenServer SDK,所有XenServer操作都可以通过PowerShell SDK完成。

  XenServer 8.0之前的版本没有提供定期快照功能,想通过快照实现初级高可用功能只能通过Linux脚本或手工实际。下面的脚本通过XenServer PowerShell 模块实现批量快照功能,如果要实现定期快照功能,可以创建任务计划定期执行脚本。

前置条件

  1. 需要一台Windows 虚拟机,建议使用Windows 10或 Windows Server 2016及以上版本;
  2. 需要PowerShell解除脚本执行限制,参考:如何启用PowerShell脚本执行功能,以及如何在任务计划调用PowerShell脚本;
  3. 将XenServerPSModule导入虚拟机,位置:“C:\Windows\System32\WindowsPowerShell\v1.0\Modules”,只导入XenServer SDK中“XenServerPowerShell”文件夹下的“XenServerPSModule文件夹及子文件夹和文件即可;
  4. 如果没有XenServer SDK可以从官方下载链接(需要Citrix.com帐户);如果没有官方下载权限,可以从此处下载;
  5. 将XenServer Root帐户密码加密为密文密码,参考:PowerShell如何对密码加密和调用认证信息;
  6. 整理需要快照的虚拟机文件和虚拟机格式,虚拟机文件名默认为“VMList.txt”,每行为一台虚拟机信息,每行由虚拟机UUID和虚拟机名称组成,两段信息以英文“,”分隔;示例:
    29abdc72-ba08-c6f6-7641-cb0b9b637c0d,DDC01
    8c5ef4cf-7bec-476d-ad44-96199f896fb1,VDA1

批量快照脚本

  1. 请将以“<>”括起来的内容改为需要执行快照的环境信息;
  2. 该脚本默认保存最近3次的快照,其它快照全部删除,更改环境变量“$SnapshotNo”的参数可更改快照保留数量;
  3. 快照执行脚本,加密密码文件和执行成功以及失败的日志,保留在同一目录;
#导入XenServer PowerShell模板
Import-Module XenServerPSModule ;

#脚本文件和日志根路径
$Root = "<D:\Linshi>"
# 获取需要快照的虚拟机的文件
$VMuuidList = Get-Content "$Root\VMList.txt" ;
# 保存快照的数量
$SnapshotsNo = 3 ;
#成功日志文件名和位置
$LogSuccess = "$Root\Logs_Snapshot_Sucess.log" ;
#失败日志文件名和位置
$Logfailure = "$Root\Logs_Snapshot_failure.log" ;

# 主机连接参数
$Xenhost = "<192.168.1.111>" ;
$Username = "root" ;
$Password = "$Root\Password.txt" ;
$MyCredential =New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username, (Get-Content $Password | ConvertTo-SecureString)

# 登录XenServer服务器
Try {
    $Session = Connect-XenServer -Url https://$Xenhost -Creds $MyCredential -NoWarnCertificates -SetDefaultSession
} Catch [XenAPI.Failure] {
    [string]$PoolMaster = $_.Exception.ErrorDescription[1]  
    Write-Host -ForegroundColor Red "$($Pools.$Pool) is slave, Master was identified as $PoolMaster, trying to connect"
    $Pools.Pool = $PoolMaster
    $Session = Connect-XenServer -url "http://$PoolMaster" -Creds $MyCredential -NoWarnCertificates -SetDefaultSession
}

ForEach ($VMuuid in $VMuuidList) {
    #获取VMUUID和名称信息
    $VMName = $VMuuid.Split(",")[1] ;
    $VMUuid = $VMuuid.Split(",")[0] ;
    # 检查虚拟机是否存在
    $VMuuidTest = (Get-XenVM -uuid $VMuuid).uuid ;
    if ($VMuuidTest) {
        # 快照名称
        $NewSnapshotName = get-date -Format 'yyyyMMddHHmmss' ;
        #创建快照
        Invoke-XenVm -Uuid $VMuuid -XenAction Snapshot -NewName $NewSnapshotName ;
        #获取需要删除的快照
        $DelSnapshots = (Get-XenVM | Where-Object {$_.is_a_snapshot -eq "True" -and $_.snapshot_metadata -match "$VMUuid"} | Sort-Object -Property snapshot_time -Descending | Select-Object -Skip $SnapshotsNo).uuid ;
        ForEach ($SnapshotName in $DelSnapshots) {
            #删除快照的VDI文件
            Get-XenVM -Uuid $SnapshotName | Select -ExpandProperty VBDs | Get-XenVBD | Select -ExpandProperty VDI | Get-XenVDI | Remove-XenVDI ;
            #删除快照和VBD信息
            Remove-XenVm -Uuid $SnapshotName ;
        }
    }
    #获取快照信息
    $SnapshotCheck = Get-XenVM -Name $NewSnapshotName | Where-Object {$_.is_a_snapshot -eq "True" -and $_.snapshot_metadata -match "$VMUuid"} ;
    if ($SnapshotCheck) {
        #如果快照信息获取成功,打印成功日志
        "虚拟机快照成功 时间: $NewSnapshotName 虚拟机uuid:$VMuuid 虚拟机名称: $VMName" | Out-File -FilePath $LogSuccess -Append -Encoding utf8 ;
    } else {
        #如果快照信息获取失败,打印失败日志
        "虚拟机不存在或uuid错误 时间: $NewSnapshotName 虚拟机uuid:$VMuuid 虚拟机名称: $VMName" | Out-File -FilePath $Logfailure -Append -Encoding utf8 ;
    }
}
#断开XenServer连接
Disconnect-XenServer ;

#删除当前会话的XenServer PowerShell模板
Remove-Module XenServerPSModule ;

任务计划定期执行

创建任务计划,定期创建虚拟机快照。

  1. 创建任务计划,参考:Windows创建任务计划
  2. 在任务计划中如何调用PowerShell脚本,参考:如何启用PowerShell脚本执行功能,以及如何在任务计划调用PowerShell脚本

执行结果

脚本执行完毕后,查看执行成功以及执行失败的结果。

发表评论