Sin categoría

PowerShell: Control de backups PowerCli + PowerVeeam

La Idea es realizar una tarea programada que lanza un PS en el cual nos conectamos a veeam y comprobamos el estado de las copias.

por otro lado nos conectamos al Vcenter o ESXI y confirmamos que esas VMs tienen un backup.

Como en muchas ocasiones tenemos VMs de test que no necesitan copias añadiremos en el ESXI una etiqueta que informe si necesita o no contraseña

enviamos por mails los resultados.

Necesidades previas:

Instalacion de PowerCli + PowerShell veeam

Codigo!

#Realizamos la conexion con el ESXI por funcion

function get-Conexion{

    Connect-VIServer 10.0.1.XX -user Administrado@vsphere.local -Password Contraseña

}

#Funcion para importar los CMDLETS de veeam y cli

function get-DSTcmdlets{

### Import CMDlets ######

Add-PSSnapin -Name VeeamPSSnapIn -ErrorAction SilentlyContinue

New-Item -Path $Profile -ItemType file -Force

                    & ‘C:\Program Files (x86)\VMware\Infrastructure\PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1’

}

function get-DSTvmnoback{

#### VM con copias y sin copias (todas las copias sin filtrar)

# Montamos un filtro en el que si se detecta que no se realiza Backup

# commando base  -> Get-VBRJob  | Get-VBRJobObject | Select-Object name

# Iniciamos una variable a 0 para que si entra en el tendremos que enviar un correo #avisando que hay una VM en el ESXI que no tiene copias de seguridad

$vmcmail = «0»

# iniciamos Array vacio  para almacenar las VMs que

$reportSV = @()

# lanzamos la consulta que almacenamos en el array anterior

$vms = Get-VM | Select-Object name

#Recorremos el resultado maquina por maquina (maquinas en el ESXI)

ForEach($vm in $vms)

{

 # Recorremos los jobs y miramos las maquinas que tienen dentro

 $vmbs=Get-VBRJob  | Get-VBRJobObject | Select-Object name

# Si encontramos una discordancia la siguiente variable marcara la entrada en el no #existe Copia, pero si VM

 $vmc = «0»

    foreach ($vmb in $vmbs)

    {

      if ($vmb -match $vm)

        {

      $vmc = «1»

        }

    }

if ($vmc -eq «0»){

$tags = get-vm $vm.Name | Get-Annotation |Where-Object {$_.Name -eq “DST-copias” } 

 <#condicionamos los que tienen etiquetas para conocer el motivo porque no se realiza copias (hablamos de las etiquetas más adelante), pero es básicamente eso en el ESX poner una referencia de si se necesita hacer copia o no #>

    if ($tags -like «*No*»)

        {

        $reportSV += $tags

        }

        else

        {

   $vm.Name 

    $reportSV += $vm.Name     

        }

$reportSV

$vmcmail = «1»

}

}

####

}

$report = @()

#Comparar copias con maquias

#### Esta parte del código guarda la información de los backups en un Excel

foreach($jobC in (Get-VBRBackupSession | Where-Object {$_.JobType -eq «Backup»  -and $_.EndTime -ge (Get-Date).AddDays(-1).AddHours(-4.5)} | select name, endtimeUTC, result, state, JobTypeString)){

# Ponemos la cabecera del Excel con los campos que vamos a guardar

# en los Row guardamos la informacion

$row = “” | Select FechaEjecucion, HoraEjecucion, name, endtimeUTC, result, state, JobTypeString, SoloFallos

$row.FechaEjecucion = get-date -Format d

$row.HoraEjecucion = Get-Date -UFormat %r

$row.name = $jobC.name

$row.endtimeutc = $jobC.endtimeutc

$row.result = $jobC.result

$row.state = $jobC.state

$row.jobtypestring = $jobC.jobtypestring

if($jobC.result -like «Faile*»)

    {

    $row.SoloFallos = «Failed» 

    }

$report += $row

}

#La informacion la almacenamos en la variable $report y la añadimos en un CSV

$report | Export-Csv -Path C:\ReportBackups.csv -NoTypeInformation -UseCulture -Append

 ###LLAmamos a las funciones anteriores de importacion de cmdlets y de  conexion

get-DSTcmdlets

get-Conexion

 #Examinamos las copias de seguridad y realizamos un mail 1 con todos los backups

#otro con todos los fallos

# Miraremos las copias del dia anterior y 4,5h antes (Get-Date).AddDays(

#1).AddHours(-4.5)}

#por tarea programada lanzo este script a las 21.00 porque me va bien con mis copias

$copias = Get-VBRBackupSession | Where-Object {$_.JobType -eq «Backup»  -and $_.EndTime -ge (Get-Date).AddDays(-1).AddHours(-4.5)} | select name, endtimeUTC, result, state, JobTypeString | ft

$copias2 = Get-VBRBackupSession | Where-Object {$_.JobType -eq «Backup»  -and $_.result -like «Faile*» -and $_.EndTime -ge (Get-Date).AddDays(-1).AddHours(-4.5)} | select name, endtimeUTC, result, state, JobTypeString | ft

## Envio de mails.

Send-MailMessage -To «a@a.es» -From » <b@b.es>» -Subject » Veeam Fallo Ultimas 24h» -Body ($copias2 | Out-String)  -SmtpServer mail.martinezmartinez.es

Send-MailMessage -To «b@b.es» -From » <a@a.es>» -Subject » Veeam 24h» -Body ($copias | Out-String)  -SmtpServer mail.martinezmartinez.es

###Comparamos ESXI con Veeam

get-DSTvmnoback

if ($vmc -eq «0»){

foreach ($tag in $tags){

Send-MailMessage -To «a@a.es» -From » <b@b.es>» -Subject » – Hemos encontrado VMS sin un backup» -Body ($reportSV | Out-String)  -SmtpServer mail.martinezmartinez.es

$reportSV

$vmcmail=»0″

}

}

## desconectamos 

Disconnect-VIServer -Server * -Force

Etiquetado

Conectados al ESXI

crear etiqueta

    New-CustomAttribute -Name ETIQUETA -TargetType VM

Modificar etiqueta

 Set-Annotation -Entity «VM» -CustomAttribute «DETIQUETA» -Value «No necesita copia «

Deja una respuesta