2016. december 20., kedd

Virtuális gépek címkézése meglévő CMDB adatok alapján, avagy Tag kezelés PowerCLI segítségével

A hatos verzió előtt az ún. "Custom Attributes" használatával tudtunk egyedi megjegyzéseket fűzni a virtuális gépekhez. Egy időben igyekeztem használni, de a beállított értékeket nagyon nehéz volt követni, szükség esetén módosítani, stb. Így egy idő után már nem sok köze volt a valósághoz.
Az új, hatos verzióban megjelent Tag-ek sokkal rugalmasabban kezelhetőek, de ha nem gondoskodunk az értékek aktualizálásáról, akkor az sem sokat ér. Főleg ha a gépek száma már közel van az ezerhez.
Viszont ha van egy olyan nyilvántartásunk, amiben minden fontos adat megtalálható, azok aktualizálása megoldott, akkor adja magát, hogy ezeket a címkéket (vegyesen használom a következőkben a tag és címke kifejezést) onnan töltsük fel, és időnként onnan frissítsük. Erre pedig a PowerCLI tökéletes eszköz. De mielőtt ebbe belemennénk, nézzük meg röviden, milyen lehetőségeink vannak a címkék kezelésére a PowerCLI-ban, illetve mi is az a Tag?

Egyszerűen lekérdezhetjük, hogy milyen parancsok állnak a rendelkezésünkre:



Az infrastruktúra különböző elemeihez (virtuális gépek, hostok, datastore-ok, stb) különböző címkéket fűzhetünk. Pl. egy virtuális géphez hozzáfűzhetünk egy Tulajdonos és/vagy egy költséghely címkét. Ehhez a következő lépéseket kell megtenni.

  • létrehozni egy Tulajdonos nevű Tag ketegóriát
    New-TagCategory -Name "Tulajdonos" -Cardinality single -EntityType VirtualMachine 
  • kategórián belül létrehozni különböző cimkéket
    $NewTag1=New-Tag -Name "Kovács János” -Category Tulajdonos
    $NewTag2=New-Tag -Name „Nagy Béla” -Category Tulajdonos
  • ezeket hozzárendelni egy vagy több virtuális géphez.
    New-TagAssignment -Tag $NewTag1 -Entity $vm1
    New-TagAssignment -Tag $NewTag2 -Entity $vm2


A kategória esetében a "Cardinality" azt jelenti, hogy egy adott objektumhoz az adott kategóriából csak egy vagy akár több is rendelhető-e. Pl. "Produktív", "Teszt" vagy "Fejlesztői" közül pontosan egy címke adható egy géphez.

Természetesen, mint a fenti képen látható, tudunk törölni, módosítani, lekérdezni címkéket, kategóriákat, hozzárendeléseket. Ezekre részleteiben nem térnék ki, egy részük benne lesz a következő példa scriptben.

A konkrét feladat a következő. Létezik egy adatbázis, amiben a gépekről mindenféle információ napkarész állapotban elérhető. Ez egy MS SQL adatbázis. Másrészt vannak a virtuális gépeink, amik alaphelyzetben nem rendelkeznek címkékkel. Ezt csak a Web kliensben tudjuk ellenőrizni (illetve  az új HTML5 kliensben is).


Ha gondom valamelyik géppel, akkor előbb valahol máshol meg kell néznem, hogy kit is kereshetek. Viszont ezek az infók benne vannak az előbb említett adatbázisban, így ha  onnan a fenti Tags mezőket fel tudnám tölteni, akkor kényelmesebb lenne ez ilyen helyzetek kezelése.
Mivel a PowerCLI Powershell alapú, és a Powershell természetesen támogatja az SQL adatbázisok kezelését is, így egy scriptben, direktben át lehet tölteni az adatok az adatbázisból a vCenter inventory-ba.

Mielőtt bármit tennénk, létre kell hozni a szükséges címke kategóriákat. Ebben a konkrét esetben ez így néz ki,

New-TagCategory -Name "Alk.gazda" -Cardinality single -EntityType VirtualMachine
New-TagCategory -Name "Szervergazda" -Cardinality single -EntityType VirtualMachine
New-TagCategory -Name "Emails" -Cardinality single -EntityType VirtualMachine
New-TagCategory -Name "Megjegyzes1" -Cardinality single -EntityType VirtualMachine
New-TagCategory -Name "Application" -Cardinality single -EntityType VirtualMachine
New-TagCategory -Name "PatchPhase" -Cardinality single -EntityType VirtualMachine

New-TagCategory -Name "Prod.Type" -Cardinality single -EntityType VirtualMachine 

Ezután a Powershell-hez hozzá kell adni az SQL használatához szükséges modult, majd kényelmi szempontból elnavigálunk a kérdéses adatbázishoz.

Import-Module sqlps

Set-Location SQLSERVER:\SQL\SQL_szerver\Instance\Databases\CMDB_Database 

Ezután össze kell állítani egy olyan SQL lekérdezést, ami visszaadja a kívánt adatokat. Feltételezve, hogy van egy szervertip mező, ami alapján a VMware virtuális gépek szűrhetőek.

$sqltext="select rtrim(host) host,....,<további mezők> from dbo.CMDBTable where szervertip='VMware'"

Ha ez megvan, akkor a select eredményét be kell tölteni egy tömbbe. A Powershell tartalmaz saját tömb típust, de érdemesebb használni a .Net-ben definiáltat, mivel az sokkal kényelmesebben kezelhető.

$DotNetMOMInfoArray=New-Object System.Collections.ArrayList

$DotNetMOMInfoarray=invoke-sqlcmd -Query $sqltext|select host,szervergazda, Alk.gazda,Emails,megjegyzes1,patchphase,application 

SQL Select-et az Invoke-Sqlcmd -Query parancs segítségével tudunk futtatni. Az így kapott eredményhalmazból azokat a mezőket kell csak a tömbbe tenni, amikkel foglalkozni szeretnénk. A host mező tartalmazza a gépek neveit, a többi pedig olyan értékeket, amikkel címkézni fogjuk a virtuális gépeket. Azaz ebben a konkrét esetben szervergazda, alkalmazás gazda, email címek, megjegyzés1 mező, patch fázis, és alkalmazás azonosító.

Nézzük a script "törzsét" . (a címkékkel kapcsolatos műveletek egy külön eljárásban lesznek)

$vm_lista=get-vm Location Datacenter1

foreach ($vm in $vm_lista)
{

$mom_hostname=$vm.name

$HolVAn=$DotNetMOMInfoArray.Host.IndexOf($mom_hostname)

if ($HolVan -ne -1)
{
    cimke1 'Szervergazda'
    cimke1 'Emails'
    cimke1 'Alk.gazda'
    cimke1 'megjegyzes1'
    cimke1 'patchphase'
    cimke1 'application'
}


$vm_lista változóba betöltjük a szükséges géplistát, majd egyesével megnézzük, hogy az SQL lekérdezésben szerepel-e a gép. Ha igen, akkor a lentebb lévő eljárást meghívjuk a hatféle címke kategóriának megfelelően.

A legegyszerűbb az lenne, ha mindig törölnénk a meglévő címkéket, és újra létrehoznánk őket. De feltételezve, hogy ezek az értékek ritkán változnak meg, jobbnak tűnik az, ha egy kicsit bonyolultabb scriptet írunk, és csak ahhoz nyúlunk, ami megváltozik. Nézzük az eljárást.

function cimke1{

param($t_category)


    if (-not $DotNetMOMInfoArray[$HolVAn].$t_category)
    {
        $DotNetMOMInfoArray[$HolVAn].$t_category='--Nincs--' 
    }

    $ExistingTag=Get-Tag  -Category $t_category |where {$_.name -eq    $DotNetMOMInfoArray[$HolVan].$t_category}
   
  
    if ($ExistingTag)
    {
        $VMTag=Get-TagAssignment -Entity $vm -Category $t_category -ErrorAction SilentlyContinue
        if ($VMTag.Tag.Name -ne $ExistingTag.Name)
        {
             Remove-TagAssignment -TagAssignment $VMTag -Confirm:$false
             New-TagAssignment -Tag $ExistingTag -Entity $vm
        }
       
    }
    else
    {
        $NewTag=New-Tag -Name $DotNetMOMInfoArray[$HolVAn].$t_category -Category $t_category
        $VMTag=Get-TagAssignment -Entity $vm -Category $t_category -ErrorAction SilentlyContinue
        Remove-TagAssignment -TagAssignment $VMTag -ErrorAction SilentlyContinue -Confirm:$false
        New-TagAssignment -Tag $NewTag -Entity $vm

    }


    } cimke #függvény vége 

Néhány megjegyzés.

  • döntés kérdése, hogy ha egy szerver esetében egy adott címke nem létezik, akkor mi legyen. Egyáltalán ne hozzuk létre, vagy ahogy én csináltam, egy "--nincs--" szöveggel jelöljük.
  • $t_category tartalmazza, hogy melyik címke kategóriáról van szó
  • ha egy címke még nem létezik, akkor előbb létre kell hozni
  • ha egy gépnek már van címkéje, de az SQL adatbázisban megváltozott, akkor előbb törölni kell, majd újra létrehozni.

A végére pedig nézzük meg a végeredményt:


Remélhetőleg van még olyan, aki még ezeket nem ismerte és segíteni tudtam.

Végezetül mindenkinek Kellemes Ünnepeket Kívánok!!


Nincsenek megjegyzések:

Megjegyzés küldése