2. diel - Aktualizácie CMDB z mnohých zdrojov dát
V predchádzajúcej lekcii, Prečo a ako začať s Konfiguračný databázou (CMDB) , sme si ukázali, prečo a ako začať s Konfiguračný databáz, s čím nám pomôže a ako sa vyhneme možným problémom pri implementácii.
V prípade aktualizácie CMDB čelíme výzve dát prichádzajúcich z mnohých zdrojov. Nižšie si ukážeme, ako k danej veci pristúpiť z praktického pohľadu.
Import dát
V našom príklade budeme pracovať s entitou serverov ( Machine, OS server). V CMDB budeme chcieť udržiavať zoznam všetkých serverov, pretože ide o zásadnú konfiguračné položku. Jedná sa ale o všeobecný prístup, ktorý môžeme uplatniť pri akýchkoľvek aktualizáciách dát.
V ideálnom svete by sme zaistili jeden aktuálny súbor, ktorý by sme importovali a potom vykonali nasledujúce:
- Založili nové záznamy pre servery, ktoré sa objavili v súbore, ale ešte neboli v CMDB.
- Aktualizovali hodnoty serverov, ktoré boli v súbore aj v CMDB.
- Zmazali záznamy serverov, ktoré sú v CMDB, ale nie sú v súbore importu.
Všetky tieto tri operácie možno jednoducho nastaviť zaškrtnutím zodpovedajúcich vlastností v definícii importu. Importné súbor v CMDB ObjectGears získame použitím infraštruktúrne funkcie OG_Servers. Obdobné funkcionality automatického zistenia konfiguračných položiek majú aj iné CMDB. Môžeme však mať akokoľvek vynikajúce CMDB softvér, ale rovnako vždy narazíme na jeden problém.
V skutočnosti vyššie popísaný postup importu a aktualizácie dát takto jednoduchý nebýva. Servery sa nachádzajú v rôznych sieťach, pri ktorých nie sú nastavené prístupy pre zaistenie skenovanie infraštruktúry. Môžeme používať viac domén Active Directory, servery v rôznych DMZ, vysoko zabezpečené segmenty, cloud alebo siete sesterských spoločností, do ktorých nemáme vôbec prístup. Takáto infraštruktúra siete môže vyzerať takto:
V takom prípade budeme mať pravdepodobne viac vstupných súborov a u niektorých serverov sa rozhodneme pre manuálne aktualizáciu dát.Vytvoríme si preto viac importov a v každom z nich nastavíme filter okruhu záznamov, ktoré budú aktualizované. Ak napríklad vieme, že v určitom súbore sú všetky servery z testovacej domény, nastavíme filter importu na vlastnosť serveri definujúci testovacie doménu. Pri vyhodnotení, ktoré servery majú byť zmazané, sa vezmú do úvahy iba servery z tejto domény. Bez nastavenia tohto filtra by sa zmazali všetky ostatné servery (aj tie mimo testovacie doménu), pretože neboli v importnom súbore.
Automatické zmazanie serverov, ktoré neboli v importnom súboru môže byť problematické. Môže sa stať, že súbor nie je vyplnený správne z dôvodu chyby v skripte alebo daný server neodpovedal na otázku ohľadom svoju konfigurácie. V prvom prípade môžeme využiť nastavenia importu. Import sa nevykoná, ak import obsahuje odchýlku od očakávaného množstva záznamov. Druhý typ problému je vhodné riešiť skôr označením záznamov, ktoré neboli v poslednom importe a uvedením dátumu a času posledného importu, v ktorom bol server nájdený. Takto možno identifikovať záznamy, u ktorých by sme mali overiť, či nemajú byť zmazané.
Ďalším vhodným prvkom je zavedenie indikátora, či sa daný server aktualizuje manuálne. O týchto serveroch budeme vedieť, že sa v importoch nikdy neobjaví a budeme teda musieť zabezpečiť ich ručnú aktualizáciu.
Riešenie problému importu z viacerých zdrojov
Entitu serverov (alebo inú entitu, ktorú budeme chcieť importovať) rozšírime o nasledujúce vlastnosti:
kód | Názov | Typ stĺpca | popis |
manual_update | Manuálna aktualizácia | Áno / Nie | Vlastnosť je nastavovaná ručne. |
present_in_last_import | Nájdený v poslednom importe | Áno / Nie | Vlastnosť nastavuje skript bežiaci po dokončení importu. Pre užívateľov je len na čítanie. |
last_import_datetime | Dátum a čas posledného importu | Dátum a čas | Vlastnosť nastavuje skript bežiaci po dokončení importu. Pre užívateľov je len na čítanie. |
Označenie záznamov v stĺpcoch present_in_last_import a last_import_datetime zaistí skript importu (záložka Spustiť po dokončení importu):
Príklad JavaScriptu, ktorý rieši vyššie uvedené označenie záznamov:
/* U serverov, ktoré boli v importnom súboru (matchování stĺpce triedy name a stĺpce súboru Name) označiť pole present_in_last_import ako Áno (u ostatných serverov nastaviť Nie). U týchto serverov z importného súboru tiež nastaviť last_import_datetime na aktuálny dátum a čas.*/ var cl = OG.ClassDef.GetById(OGActualImport.ClassDefId); var colPres = cl.Columns['present_in_last_import']; var colLast = cl.Columns['last_import_datetime']; /* present_in_last_import = Nie */ var sql = 'update datarow' + cl.Id + ' set ' + colPres.DBColumnName + ' = 0' + ' where Id not in (select LastChildDataRowId from ' + OGActualImportDbTable + ' where IsError = 0)'; OG.Sql.RunSql(sql); /* present_in_last_import = Áno, last_import_datetime = sysdate */ var sql = 'update datarow' + cl.Id + ' set ' + colPres.DBColumnName + ' = 1, ' + colLast.DBColumnName + ' = getdate() ' + ' where Id in (select LastChildDataRowId from ' + OGActualImportDbTable + ' where IsError = 0)'; OG.Sql.RunSql(sql);
Otázky mapujúci kvalitu CMDB
Nižšie uvedené dva otázky môžeme vložiť do stránky mapujúci kvalitu dát v CMDB.
Otázka pre identifikáciu novo založených záznamov:
SELECT m.name, d.Name AS Datasource, m.created, '53-' + convert( varchar, m.id) AS FullId FROM {{:class.machine:}} m INNER JOIN DataSource d ON m.createddatasourceid = d.id WHERE d.referenceid IS NOT NULL and m.status IS NULL
Otázka pre identifikáciu záznamov, u ktorých by malo byť preverené, či nemajú byť zmazané:
SELECT m.name, m.created, m.last_import_datetime, '53-' + convert( varchar, m.id) AS FullId FROM {{:class.machine:}} m WHERE (m.present_in_last_import IS NULL OR m.present_in_last_import = 0) AND (m.manual_update IS NULL OR m.manual_update = 0) AND m.deleted IS NULL
Notifikácia o novo založených serveroch
Pokiaľ budú identifikované nové servery a založené zodpovedajúce záznamy v CMDB, budeme chcieť odoslať notifikáciu s uvedením serverov, ktoré boli zriadené.
Vytvoríme si notifikáciu, ktorú nastavíme na odoslanie po úspešnom spustení importu:
V notifikáciu na záložke Skript uvedieme nasledujúci kód:
var data = OG.GetItem('server-notif-data'); if ( OG.IsNull(data)) { // nacistov id datasource var sql = OG.TextUtils.Format( "select max(id) from DataSource where ReferenceId = {0} and Name like 'Import {0}: %'", OGImport.Id); var dsId = OG.Sql.RunScalarSql(sql); // nacistov z cl nove zaznamy - maju createddatasourceid, boli vytvorené po ir.start var drf = OG.DataRow.GetDataRowFilter(OGImport.ClassDefId); drf['createddatasourceid'] = dsId; drf.AddAndCon( OG.DataRow.CreateConLe(OGImport.ClassDef.Columns['created'], OGImportRun.DateTimeStart.AddMinutes(-1))); //drf.WriteSqlToLog = true; // prejsť a vytvorit odkazy na dr data = 'V importe nebol nájdený žiadny nový server.'; var drl = OG.DataRow.GetDataByFilter(drf); if ( drl != null && drl.Count > 0) { data = ''; for( var i = 0; i < drl.Count; ++i) { var dr = drl[i]; data += OG.TextUtils.Format( '<a href="{2}{1}">{0}</a><br />', dr.ShortDescriptionOrFullIdEnvelope, dr.DetailUrl, OG.GetWebUrl()); } } OG.SetItem('server-notif-data', data); } OGMessage.Body = OGMessage.Body.Replace( '#SERVERY#', data);
Výsledkom bude email so zoznamom serverov, ktoré sa novo objavili v importe s preklikom na príslušný záznam v CMDB.
V ďalšej lekcii, Konfiguračnej položky CMDB , sa pozrieme na konfiguračnej položky na konkrétnom príklade serverov a hardware.