WSMAN je zvoleným rozhraním API pro správu řadiče Dell iDRAC a v současné době se pracuje na tom, aby vzdálená správa systému byla co nejkomplexnější a nejjednodušší. Nedávno jsem strávil nějaký čas s protokolem WSMAN pro implementaci doplňků a po počáteční akci výčtu wsman je protokol WSMAN trochu zmatečný. Neexistuje žádná jednoduchá dokumentace/příklady, jak vyvolat akce get/put/create/delete/custom se správnými vlastnostmi klíče. Primárním zdrojem těchto informací je specifikace WSMAN DMTF a specifikace vazeb WSMAN-CIM, jejichž dodržování je bolestně zdlouhavé. Opět platí, že většina obsahu tohoto článku pochází z dokumentace specifikací DMTF. Toto je pokus vysvětlení těchto informací pomocí několika příkladů (v systému Linux).
Již jsem zveřejnil dokument whitepaper o tom, jak začít se službou SFCB a openwsman na adrese
https://linux.dell.com/files/whitepapers/WBEM_based_management_in_Linux.pdf. Pokud se službou WSMAN/SFCB začínáte, soubor pdf by byl lepším výchozím bodem než tento článek. Stejně jako ve výše uvedeném dokumentu whitepaper se v tomto článku budeme primárně zabývat implementacemi openwsman a SFCB CIMOM.
Existuje způsob, jak zobrazit seznam všech komponent, které lze spravovat pomocí rozhraní wsman API? Většina serverů WSMAN komunikuje s funkcí CIMOM na backendu a zpřístupňuje funkce správy CIMOM. To znamená, že možnosti správy serveru WSMAN závisí na poskytovatelích CIM registrovaných ve funkci CIMOM na backendu. Služba CIMOM má vnitřní funkci s definovaným názvem
EnumerateClassNames, kterou lze volat pro výpis všech tříd, které jsou registrovány ve službě CIMOM.
Vzhledem k tomu, že ve specifikaci WSMAN neexistuje žádné mapování typu „jeden na jeden“ pro funkci EnumerateClassNames, je tato metoda vyvolána jako jakákoli jiná vlastní funkce ve službě WSMAN. Upozorňujeme, že se to týká pouze konkrétní implementace wsmancli. To se může v budoucích verzích lišit nebo aktualizovat.
Vnitřní funkci CIMOM
EnumerateClassNames lze volat následujícím způsobem pomocí rozhraní wsmancli:
wsman invoke -a EnumerateClassNames --hostname=test_host --port=5985 --username=abc --password=password http://schemas.openwsman.org/wbem/wscim/1/instrinsic --namespace=root/cimv2
<s:Body>
<n1:EnumerateClassNames>
<n1:name>root/cimv2:CIM_Service</n1:name>
<n1:name>root/cimv2:Syslog_RecordInLog</n1:name>
<n1:name>root/cimv2:Linux_SambaValidUsersForShare</n1:name>
<n1:name>root/cimv2:Linux_BaseBoard</n1:name>
<n1:name>root/cimv2:Linux_SambaForceUserForShare</n1:name>
<n1:name>root/cimv2:Linux_Processor</n1:name>
<n1:name>root/cimv2:CIM_RecordForLog</n1:name>
<n1:name>root/cimv2:Linux_SambaShareForService</n1:name>
<n1:name>root/cimv2:Linux_SambaServiceConfigurationForService</n1:name>
<n1:name>root/cimv2:Linux_SambaHostsForService</n1:name>
<n1:name>root/cimv2:Linux_SambaForceUserForGlobal</n1:name>
<n1:name>root/cimv2:CIM_OSProcess</n1:name>
<n1:name>root/cimv2:CIM_RunningOS</n1:name>...................
Výstup bude vypadat jako ten výše uvedený, který značí, že v oboru názvů root/cimv2 je Linux_Processor jednou z registrovaných tříd. Existuje několik tříd CIM, které jsou zděděny při registraci nových tříd v oboru názvů root/cimv2 a výše uvedený příkaz vypíše všechny jejich názvy. Obecně platí, že můžete ignorovat všechny třídy s předponou
CIM_. Všechny třídy s předponou
Linux_ jsou třídy, které jsou registrovány poskytovateli nainstalovanými v systému Linux. Při práci s řadičem iDRAC společnosti Dell vás budou zajímat především třídy s předponou
DCIM_.
Teď, když máte seznam všech názvů tříd, můžete použít vnitřní funkci
getClass k extrahování definice třídy
Linux_Processor následujícím způsobem:
wsman invoke -a GetClass --hostname=test_host --port=5985 --username=abc --password=password http://schemas.openwsman.org/wbem/wscim/1/intrinsic/Linux_Processor --namespace=root/cimv2
Výše uvedený příkaz zobrazí seznam všech vlastností, které jsou místně definovány ve třídě
Linux_Processor. To znamená, že žádná z vlastností, které jsou zděděny z jiných tříd
CIM_*, nejsou uvedeny v aktuální implementaci. Obvykle z definice třídy můžete zjistit, jaké metody jsou ve třídě definovány, jaké parametry je třeba těmto metodám předat a jaké vlastnosti třídy jsou klíčové atd. Vzhledem k tomu, že výše uvedený příkaz vrací pouze místní vlastnosti, nelze klíčové vlastnosti ve třídě identifikovat. Opět se v současné době jedná o omezení implementace v rozhraní wsmancli.
I když je tedy funkce GetClass dobrým výchozím bodem, její výstup není dostatečný k určení toho, jaké vlastnosti třídy lze použít jako klíčové, aby bylo možné vyvolat akci get/put/create/custom. Jaké další techniky lze tedy použít k dosažení tohoto cíle? A právě zde mohou pomoci reference EPR.
EPR (End Point Reference) je ukazatel na instanci se dvěma informacemi: ResourceURI a Selector Set. ResourceURI má název třídy, ze které je instance vytvořena, a Selector Set uvádí vlastnosti, se kterými lze instanci jednoznačně identifikovat. Reference EPR konkrétní třídy lze vypsat pomocí příkazu podobného následujícímu:
wsman enumerate -M epr http://sblim.sf.net/wbem/wscim/1/cim-schema/2/Linux_Processor -h test_host-P 5985 -u abc -p password -O out
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsen="http://schemas.xmlsoap.org/ws/2004/09/enumeration" xmlns:wsman="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">
<s:Header>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
<wsa:Action>http://schemas.xmlsoap.org/ws/2004/09/enumeration/PullResponse</wsa:Action>
<wsa:RelatesTo>uuid:ca52c9e9-cd47-1d47-8003-a52924d9bed4</wsa:RelatesTo>
<wsa:MessageID>uuid:ca622bb3-cd47-1d47-8097-a52924d9bed4</wsa:MessageID>
</s:Header>
<s:Body>
<wsen:PullResponse>
<wsen:EnumerationContext>ca4fdd21-cd47-1d47-8095-a52924d9bed4</wsen:EnumerationContext>
<wsen:Items>
<wsa:EndpointReference>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
<wsa:ReferenceParameters>
<wsman:ResourceURI>http://sblim.sf.net/wbem/wscim/1/cim-schema/2/Linux_Processor</wsman:ResourceURI>
<wsman:SelectorSet>
<wsman:Selector Name="__cimnamespace">root/cimv2</wsman:Selector>
<wsman:Selector Name="SystemCreationClassName">Linux_ComputerSystem</wsman:Selector>
<wsman:Selector Name="SystemName">localhost.localdomain</wsman:Selector>
<wsman:Selector Name="CreationClassName">Linux_Processor</wsman:Selector>
<wsman:Selector Name="DeviceID">0</wsman:Selector>
</wsman:SelectorSet>
</wsa:ReferenceParameters>
</wsa:EndpointReference>
</wsen:Items>
</wsen:PullResponse>
</s:Body>
</s:Envelope>
Ze všech procesorů v cílovém systému patří výše uvedený výstup pouze jednomu procesoru. Ve výstupu resourceURI je uveden jako http://sblim.sf.net/wbem/wscim/1/cim-schema/2/Linux_Processor a SelectorSet uvádí hodnoty __cimnamespace, SystemCreationClassName, SystemName, CreationClassName a DeviceID. To znamená, že ze všech vlastností ve třídě Linux_Processor (zděděné a místně definované) lze tyto vlastnosti použít k jednoznačné identifikaci instance.
Od příkazu tedy můžete očekávat platnou odpověď, jako je:
wsman get http://sblim.sf.net/wbem/wscim/1/cim-schema/2/Linux_Processor?SystemCreationClassName="Linux_ComputerSystem",SystemName="localhost.localdomain",CreationClassName="Linux_Processor",DeviceID="3",__cimnamespace="root/cimv2" -h test_host -P 5985 -u abc -p password -O get
Pokud jsou ve výše uvedeném požadavku použity nějaké další vlastnosti, funkce CIMOM v backendu nebude moci instanci jednoznačně identifikovat. Podobně pokud existují nějaké vlastní metody, které je třeba spustit v instanci, lze pomocí referencí EPR třídy určit klíčové vlastnosti, pomocí kterých se má metoda vyvolat.
Můžete také vypsat reference EPR asociace. Vzhledem k názvu třídy nelze zjistit, zda se jedná o standardní název třídy nebo asociační třídu. Vzhledem k tomu, že instance asociace má ukazatele na dvě instance, reference EPR asociace bude mít referenci EPR instancí/objektů, na které asociace odkazuje. Následuje příklad téhož:
wsman enumerate -M epr http://sblim.sf.net/wbem/wscim/1/cim-schema/2/Linux_CSProcessor -h test_host -P 5985 -u abc -p password -O out
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsen="http://schemas.xmlsoap.org/ws/2004/09/enumeration" xmlns:wsman="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">
<s:Header>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
<wsa:Action>http://schemas.xmlsoap.org/ws/2004/09/enumeration/PullResponse</wsa:Action>
<wsa:RelatesTo>uuid:2efbfcad-cd4b-1d4b-8003-a52924d9bed4</wsa:RelatesTo>
<wsa:MessageID>uuid:2efc1c6f-cd4b-1d4b-80b3-a52924d9bed4</wsa:MessageID>
</s:Header>
<s:Body>
<wsen:PullResponse>
<wsen:EnumerationContext>2ef7f6f5-cd4b-1d4b-80b1-a52924d9bed4</wsen:EnumerationContext>
<wsen:Items>
<wsa:EndpointReference>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
<wsa:ReferenceParameters>
<wsman:ResourceURI>http://sblim.sf.net/wbem/wscim/1/cim-schema/2/Linux_CSProcessor</wsman:ResourceURI>
<wsman:SelectorSet>
<wsman:Selector Name="__cimnamespace">root/cimv2</wsman:Selector>
<wsman:Selector Name="GroupComponent">
<wsa:EndpointReference>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
<wsa:ReferenceParameters>
<wsman:ResourceURI>http://sblim.sf.net/wbem/wscim/1/cim-schema/2/Linux_ComputerSystem</wsman:ResourceURI>
<wsman:SelectorSet>
<wsman:Selector Name="CreationClassName">Linux_ComputerSystem</wsman:Selector>
<wsman:Selector Name="Name">localhost.localdomain</wsman:Selector>
<wsman:Selector Name="__cimnamespace">root/cimv2</wsman:Selector>
</wsman:SelectorSet>
</wsa:ReferenceParameters>
</wsa:EndpointReference>
</wsman:Selector>
<wsman:Selector Name="PartComponent">
<wsa:EndpointReference>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
<wsa:ReferenceParameters>
<wsman:ResourceURI>http://sblim.sf.net/wbem/wscim/1/cim-schema/2/Linux_Processor</wsman:ResourceURI>
<wsman:SelectorSet>
<wsman:Selector Name="SystemCreationClassName">Linux_ComputerSystem</wsman:Selector>
<wsman:Selector Name="SystemName">localhost.localdomain</wsman:Selector>
<wsman:Selector Name="CreationClassName">Linux_Processor</wsman:Selector>
<wsman:Selector Name="DeviceID">0</wsman:Selector>
<wsman:Selector Name="__cimnamespace">root/cimv2</wsman:Selector>
</wsman:SelectorSet>
</wsa:ReferenceParameters>
</wsa:EndpointReference>
</wsman:Selector>
</wsman:SelectorSet>
</wsa:ReferenceParameters>
</wsa:EndpointReference>
</wsen:Items>
</wsen:PullResponse>
</s:Body>
</s:Envelope>
Linux_CSProcessor je asociací mezi třídami
Linux_ComputerSystem a
Linux_Processor, které vytváří vztah, ve kterou jsou procesory obsaženy v počítačových systémech, a tedy v oddílech GroupComponent a PartComponent.
Musel jsem strávit nějaký čas vymýšlením referencí EPR a toho, jak by je šlo použít pro přístup k jednotlivým instancím. Snad se to bude hodit i někomu dalšímu. Neváhejte mi zanechat své komentáře/návrhy níže.
Zřeknutí se odpovědnosti:
Výše uvedený článek má pouze informativní charakter. Obsah vychází z mé interpretace zmíněných technologií/terminologií. Tyto informace jsou poskytovány tak, jak jsou, a mohou obsahovat některé typografické chyby a/nebo technické nepřesnosti.