2017-07-07 55 views
-1

我有3个VMware exi 6.5主机,每个主机运行4个虚拟机。自动执行VMware快照并删除早于5天的快照

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

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

+1

这是一个很好的脚本应用程序。你到目前为止有什么,你卡在哪里?堆栈溢出不是代码写入服务。 – alroc

+0

https://serverfault.com/questions/430138/ - “*快照不是差分图像,它是一个更改日志,所以如果你在同一个地方将相同的数据写入10次,快照将增加它的大小10乘以您写入的数据的大小*“和”*这意味着,读访问不仅要读取一个文件,还要读取所有差异数据(原始数据加上对原始数据所做的每个更改)。当您级联快照时增加更多。*“。这个想法会减慢你的所有服务器,但只会让你获得夜间差异备份。 – TessellatingHeckler

+0

@alroc,我不确定从哪里开始,这就是为什么我将它发布在堆栈溢出中,我已经看到PowerCLI中的命令拍摄快照,但不知道如何让它们从powershell运行。 – JayXen

回答

0

下面是我用于VMWare的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命令。如果您需要评估listsnapshots

以下情况,我还会返回$stdout值。以下是我如何使用此功能的示例。

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的文档。希望这对你有所帮助。