【问题标题】:Automate VMware Snapshots and remove snapshots older than 5 days自动化 VMware 快照并删除超过 5 天的快照
【发布时间】:2017-07-07 02:12:49
【问题描述】:

我有 3 台 VMware exi 6.5 主机,每台运行 4 台虚拟机。

在使用 PowerCLI 的 Powershell 中,我想要一个连接到 VMware esxi 6.5 主机的脚本,执行每个 VM 的快照(不包括内存),将其命名为日期和时间,然后删除/合并超过 2 天的快照。计划是每天运行脚本,以便在勒索软件感染服务器时有一个快速回滚点。

非常感谢,非常感谢您的帮助。

【问题讨论】:

  • 这是一个很好的脚本应用程序。到目前为止你有什么,你在哪里卡住了? Stack Overflow 不是代码编写服务。
  • serverfault.com/questions/430138 - "快照不是差异镜像,它是一个变更日志,所以如果你在同一个地方写入相同的数据 10 次,快照的大小会增加10 乘以您写入的数据大小。" 和 "这意味着,读取访问不仅要读取一个文件,还要读取所有差异数据(原始数据加上对原始数据所做的所有更改)数据)。当您级联快照时,这个数字会增加更多。“。这个想法会减慢所有服务器的速度,但只会让您获得夜间差异备份。
  • PowerCLI 一个 PowerShell 模块,所以如果您“看到了命令”,那么您需要做的就是“让它们从 powershell 运行”。而且 SO 仍然不是一个代码编写服务,所以尝试一些事情,当你卡在一段特定的代码上时,提出问题。
  • 如果勒索软件加密了您的所有数据,您的快照将随着每个加密文件的写入而增长,没有限制。你有多少 TB 的可用空间,因为当快照填满数据存储时,你所有的虚拟机都将无法写入磁盘,它们将全部崩溃;数据存储已满时,VMware 无法删除快照。我做过,不好玩。一个好的备份解决方案(例如 Veeam)可以仅对昨晚以来的块更改进行差异还原,并且可以进行即时恢复,从备份存储运行 VM,然后在 VM 处于活动状态时存储迁移磁盘。
  • 无论如何,您安装 PowerCLI 和 Import-Module -Name VMware.VimAutomation.Core,然后像往常一样使用 Vmware 命令编写 PowerShell - 包括 Connect-ViServer 等等。例如danstechnotes.blogspot.co.uk/2017/04/…virtualizationhowto.com/2016/02/… 想法

标签: powershell backup vmware powercli


【解决方案1】:

以下是我用于 VMWare Workstation 的 PowerShell 函数。您将需要研究vmrun 命令以了解有关如何使其适应 ESX 需求的更多详细信息;这将使您走上正轨。我意识到这不是利用 PowerShellCLI。

function Execute-VMRunCmd{
    param(
        [Parameter(Mandatory=$true)]
        [string]$args = $(Throw "Args parameter is required.")
    )
    WriteToLog -msg "VMRun Args: $args"
    pushd $sourcePath
    $pinfo = New-Object System.Diagnostics.ProcessStartInfo
    $pinfo.FileName = $vmwareRun
    $pinfo.RedirectStandardError = $true
    $pinfo.RedirectStandardOutput = $true
    $pinfo.UseShellExecute = $false
    $pinfo.Arguments = "$args"
    $p = New-Object System.Diagnostics.Process
    $p.StartInfo = $pinfo
    $p.Start() | Out-Null
    $p.WaitForExit()
    $stdout = $p.StandardOutput.ReadToEnd()
    $stderr = $p.StandardError.ReadToEnd()
    $procExitCode = [string]$p.ExitCode
    popd
    WriteToLog -msg "stdout: $stdout, stderr: $stderr, ExitCode: $procExitCode"
    return $stdout
}

WriteToLog 是我创建的用于处理插入时间戳的日志记录的函数,但它是一个简单的$fullMsg | Out-File -FilePath $logFile -Append -NoClobber 调用。

$sourcepath 是 vmx 文件的文件夹路径,对于 ESX,您需要修改它。我切换到目录以进行一些调用。对于 ESX,我怀疑这不是必需的。

$vmwareRun 是您的 vmrun 可执行文件的路径。

Vmrun 命令行文档可在此处找到:“https://www.vmware.com/support/developer/vix-api/vix112_vmrun_command.pdf

我可以使用上面的命令来自动化 vmrun 命令。我还会返回 $stdout 值,以防您需要评估 listsnapshots 之类的输出

以下是我如何使用此功能的示例。

function Update-Snapshot{
    $snapshotName="WeeklyUpdate"

    [string]$allSnapshots = Execute-VMRunCmd -args "listSnapshots $fqp_source"
    if ($allSnapshots.Contains($snapshotName)){
        Start-Sleep -Seconds 60 
        Execute-VMRunCmd -args "deleteSnapshot $fqp_source $snapshotName"
    }
    Execute-VMRunCmd -args "snapshot `"$fqp_source`" $snapshotName"
}

请注意,我必须插入任意睡眠命令。出于某种原因,我在尝试删除没有它的快照时收到host not available 错误。我还没弄清楚为什么。

通读 VMRun 的文档。希望这对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多