2017. július 7., péntek

Egy kis PowerCLI - ki készítette a snapshotot?

Első ránézésre ez nem tűnik túl bonyolult kérdésnek. Viszont ha lekérdezünk egy snapshotot, nem lesz benne a készítőjének a neve. Ha a description vagy név mezőbe nem írta bele, akkor bizony utólag ebből megállapítani nem lehet.

$snap=Get-VM molszhbsigma01|Get-Snapshot

$snap|fl

Az eredmény:



Viszont mint általában mindenről, erről is készül bejegyzés az események közé. Csak annyi a dolgunk, hogy valahogy párba állítsuk a snapshotot a hozzá tartozó eseménnyel. Ez már így járhatónak tűnik, de van több probléma. Az egyik az, hogy az események is kipörögnek egy idő után (vCenter beállítás, ha igaz, akkor 30 nap a default). Ha ez már megtörtént, akkor sajnos ez az információ nem kinyerhető. A másik probléma, hogy ha megnézzük az eseményben és a snapshotban szereplő időket, akkor azok nem pontosan egyeznek. Lehet, hogy csak egy-két másodpercről van szó, de akkor is eltérhetnek. Az is gondot okozhat, hogy aznap készülhetett több snapshot egymáshoz közeli időkben, de mondjuk egy kivételével a többit már törölték.

Erre a problémára a lenti script készült. A lényege, hogy sorra veszem a snapshotokat, és mindegyiknél megkeresem az adott virtuális géphez tartozó azon eseményeket, amik aznap keletkeztek, és snapshot készítésről szólnak.
Ha egyáltalán nincs ilyen bejegyzés, akkor már kipörgött az adatbázisból. Ha pontosan egy darab van, akkor szerencsénk van, megtaláltuk a pontos egyezést. Ha viszont több esemény is van, azzal valamit kezdeni kell.
Erre azt találtam ki, hogy összehasonlítom az eseményekben szereplő időt a snapshotban található idővel, és azt az eseményt választom ki, ami a legközelebb van hozzá. Ennek már szinte 100%-os pontosságúnak kell lennie.

$Snapshotok=Get-VM|Get-Snapshot

$osszes=@()

foreach ($snap in $snapshotok)
{
$egysor=""|select-object vm,sh_name,sh_created,sh_createdby
$tol=$snap.Created.toshortdatestring()
$ig=$snap.Created.AddDays(1).toshortdatestring()
$egysor.vm=$snap.vm.Name
$egysor.sh_name=$snap.name
$egysor.sh_created=$snap.Created
$esemeny=Get-VIEvent -Entity $egysor.vm -Start $tol -Finish $ig|?{$_.fullformattedmessage -like '*Create virtual machine snapshot*'}

if ($esemeny.count -eq 0)
{
$egysor.sh_createdby="Már nem elérhető" #nincs meg az események közt
}
elseIf ($esemeny.count -eq 1) #pontosan egy esemény történt aznap
{
$egysor.sh_createdby=$esemeny.UserName
}
else #legalább két esemény volt aznap (adott gépre snapshot készítés)
{
$legjobb_index=0
$event_sanpshot_diff_time=[math]::abs(($snap.Created-$esemeny[0].CreatedTime).Seconds)
    for ($i=1;$i -lt $esemeny.count;$i++)
    {
        $d_time=[math]::abs(($snap.Created-$esemeny[$i].CreatedTime).Seconds)
        if ($d_time -lt $event_sanpshot_diff_time)
        {
        $event_sanpshot_diff_time=$d_time
        $legjobb_index=$i
        }
    }
$egysor.sh_createdby=$esemeny[$legjobb_index].UserName
}
$osszes +=$egysor


Ha a futtatás végén kiírjuk az $osszes változó tartalmát, akkor pont azt kapjuk, amit szerettünk volna.



Abban az esetben ha már nincs meg az esemény, a "Már nem elérhető" szöveg jelenik meg.