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 模块实现批量快照功能,如果要实现定期快照功能,可以创建任务计划定期执行脚本。
前置条件
- 需要一台Windows 虚拟机,建议使用Windows 10或 Windows Server 2016及以上版本;
- 需要PowerShell解除脚本执行限制,参考:如何启用PowerShell脚本执行功能,以及如何在任务计划调用PowerShell脚本;
- 将XenServerPSModule导入虚拟机,位置:“C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Modules”,只导入XenServer SDK中“XenServerPowerShell”文件夹下的“XenServerPSModule”文件夹及子文件夹和文件即可;
- 如果没有XenServer SDK可以从官方下载链接(需要Citrix.com帐户);如果没有官方下载权限,可以从此处下载;
- 将XenServer Root帐户密码加密为密文密码,参考:PowerShell如何对密码加密和调用认证信息;
- 整理需要快照的虚拟机文件和虚拟机格式,虚拟机文件名默认为“VMList.txt”,每行为一台虚拟机信息,每行由虚拟机UUID和虚拟机名称组成,两段信息以英文“,”分隔;示例:
29abdc72-ba08-c6f6-7641-cb0b9b637c0d,DDC01 8c5ef4cf-7bec-476d-ad44-96199f896fb1,VDA1
批量快照脚本
- 请将以“<>”括起来的内容改为需要执行快照的环境信息;
- 该脚本默认保存最近3次的快照,其它快照全部删除,更改环境变量“$SnapshotNo”的参数可更改快照保留数量;
- 快照执行脚本,加密密码文件和执行成功以及失败的日志,保留在同一目录;
#导入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 ;
任务计划定期执行
创建任务计划,定期创建虚拟机快照。
- 创建任务计划,参考:Windows创建任务计划 ;
- 在任务计划中如何调用PowerShell脚本,参考:如何启用PowerShell脚本执行功能,以及如何在任务计划调用PowerShell脚本;
执行结果
脚本执行完毕后,查看执行成功以及执行失败的结果。
THE END
暂无评论内容