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 «