A következő címkéjű bejegyzések mutatása: tag. Összes bejegyzés megjelenítése
A következő címkéjű bejegyzések mutatása: tag. Összes bejegyzés megjelenítése

2017. március 2., csütörtök

Egy kis PowerCLI - HP hostok címkézése az ILO IP címével

Az egész úgy kezdődött, hogy letöltöttem a HP Scripting Tools for Windows Powershell alkalmazást, és elgondolkodtam rajta, hogy mire is tudnám használni. Jelenleg még ismerkedési fázisban vagyok a három modullal, de azért pár hasznos dolgot már elkövettem vele.

Előbb röviden, hogy miről is van szó. Itt elérhető a fent nevezett tool. Három, külön telepíthető modulból áll: HPBIOSCmdlets, HPiLOCmdlets valamint a HPOACmdlets.

Ha feltelepítjük őket, akkor attól kezdve mind a parancssoros Powershell, mind az ISE tartalmazni fogja a *HP* parancsokat. A későbbiekben szeretnék róluk írni egy-két cikket, de most csak annyit, amennyi a tárgyban szükséges művelet elvégzéséhez szükséges.

Előbb egy változóban elmenetem az ILO-hoz szükséges belépési adatokat, majd létrehozok két tömböt.

$AdminMol=Get-Credential
$DotNetHPIloArray=New-Object System.Collections.ArrayList

$DotNetHPIlo_servernameArray=New-Object System.Collections.ArrayList 

Van egy Find-HPiLO parancs, amivel egy vagy több IP tartományban meg lehet keresni az összes iLO eszközt. A visszakapott eredményt én szűrtem, mivel vannak régebbi HP szerverek is a környezetben, de nekem azokra nem volt szükségem.

$DotNetHPIloArray=Find-HPiLO -Range IPRange1,IPrange1,IPrange3|?{$_.SPN -like "*BL460c*"

Az IPRange1 formátuma pl. ilyen: 192.168.1.1-254

Ha megnézzük, hogy mit kaptunk, akkor ilyen az output:


Mint látható, ezekért az adatokért még nem kellett bejelentkezni.

Következő lépésben keresni kellett egy olyan Get-HPiILO kezdetű parancsot, amivel visszakapjuk a host nevet. Elég sok parancs van, de azért a parancs neve alapján könnyen megtalálható a Get-HPiLOServerName cmdlet.

De ha esetleg bizonytalanok vagyunk, akkor a legegyszerűbb az, hogy egy Start-Transcript parancs után (ami ugye file-ba írja a kiadott parancsokat és az eredményüket is) lefuttatjuk az összes Get-HPiLO* parancsot egy adott iLO kártya esetén, és utólag elemezzük, hogy melyik parancs milyen adatokat adott vissza. Persze nem egyesével, hanem pl. Excelben egy per alatt összedobható ehhez egy script.

Ha megnézzük, hogy mit ad vissza a fenti parancs, akkor láthatjuk, hogy benne van az ESXi hostunk neve.


Ezek után a fent definiált másik tömböt már könnyen fel tudjuk tölteni a szükséges adatokkal.

$DotNetHPIlo_servernameArray=$DotNetHPIloArray.IP|Get-HPiLOServerName -Credential $AdminMol -DisableCertificateAuthentication|Select IP,Server_name

Ha pedig ez megvan, akkor már könnyű dolgunk van. Ebben a cikkben már részletesen írtam a tag-ek kezeléséről, így most abba már nem megyek vele. A lényeg, hogy előbb létre kell hozni egy tag kategóriát. Erre is megvan a szükséges parancs:
(New-TagCategory -Name "ILO_IP" -Cardinality Single -EntityType VMHost)

De ha gondoljuk, akkor akár az új HTML5 klienst is használhatjuk erre a célra:

Ha tehát már létezik a kategória, akkor adjuk hozzá a hostokhoz a megfelelő címkét.

$hostok=get-vmhost
foreach ($h in $hostok)
    {
    $hely=$DotNetHPIlo_servernameArray.server_name.IndexOf($h.name)
 
    if ($hely -ne -1)
     {
     $NewTag=New-Tag -Name $DotNetHPIlo_servernameArray[$hely].Ip -Category "ILO_IP"
     New-TagAssignment -Tag $NewTag -Entity $h
     }

    } 

És kész is:)


Látható, hogy van egy másik címke is, de az is hasonló módon került oda, így azt már nem részletezem.



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!!