WSMAN è l'API di gestione scelta per Dell iDRAC e al momento ci stiamo impegnando a rendere la gestione remota dei sistemi il più completa e semplice possibile. Recentemente ho dedicato del tempo al protocollo WSMAN per implementare un plug-in e, dopo l'azione iniziale di enumerazione wsman, il protocollo WSMAN diventa un po' complicato. Non esiste una documentazione o esempi semplici su come richiamare le azioni get/put/create/delete/custom con le giuste proprietà chiave. Le fonti principali di queste informazioni sono la specifica WSMAN di DMTF e la specifica di associazione di WSMAN-CIM, particolarmente lunghe da seguire. Anche in questo caso, la maggior parte del contenuto di questo articolo proviene da documenti delle specifiche DMTF. Questo è un tentativo di rendere queste informazioni più semplici da acquisire con alcuni esempi (su Linux).
Ho già pubblicato un white paper su come iniziare a utilizzare SFCB e openwsman all'indirizzo
https://linux.dell.com/files/whitepapers/WBEM_based_management_in_Linux.pdf. Per chi non conosce WSMAN/SFCB, il file PDF è un punto di partenza migliore rispetto a questo articolo. Come nel white paper di cui sopra, in questo articolo vengono trattate principalmente le implementazioni CIMOM di openwsman e SFCB.
Ora, dato un server WSMAN, c'è un modo per elencare tutti i componenti gestibili dall'API wsman? La maggior parte dei server WSMAN comunica con un CIMOM sul back-end ed espone le funzionalità di gestione dei CIMOM. Questo significa che le funzionalità di gestione di un server WSMAN dipendono dai provider CIM registrati nel CIMOM sul back-end. Il CIMOM ha una funzione intrinseca definita denominata
EnumerateClassNames che può essere chiamata per elencare tutte le classi registrate in CIMOM.
La funzione
EnumerateClassNames intrinseca di CIMOM può essere chiamata come segue con 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>...................
L'output è simile a quello riportato sopra e indica che, nel namespace root/cimv2, Linux_Processor è una delle classi registrate. Esistono diverse classi CIM che vengono ereditate quando nuove classi vengono registrate nel namespace root/cimv2 e il comando precedente elenca anche tutti i nomi di queste classi. Come regola generale, è possibile ignorare tutte le classi con il prefisso
CIM_. Tutte le classi con il prefisso
Linux_ sono le classi registrate dai provider installati in un sistema Linux. Quando si utilizza Dell iDRAC, si è interessati soprattutto alle classi con prefisso
DCIM_.
Ora che si dispone di un elenco di tutti i nomi delle classi, è possibile utilizzare la funzione
getClass intrinseca per estrarre la definizione della classe
Linux_Processor come segue:
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
Il comando precedente elenca tutte le proprietà definite in
Linux_Processor a livello locale. Ciò significa che le proprietà ereditate da altre classi
CIM_* non sono elencate con l'implementazione corrente. In genere, dalla definizione di una classe è possibile capire quali metodi sono definiti nella classe, quali parametri devono essere passati a tali metodi, quali proprietà della classe sono proprietà chiave e così via. Tuttavia, poiché il comando precedente restituisce solo le proprietà locali, non è possibile identificare le proprietà chiave nella classe. Anche in questo caso, si tratta di una limitazione di implementazione in wsmancli.
Quindi, sebbene la funzione GetClass sia un buon punto di partenza, il suo output non è sufficiente per determinare quali proprietà della classe possono essere utilizzate come proprietà chiave in modo che sia possibile richiamare l'azione get/put/create/custom. Quindi, quali altre tecniche possono essere utilizzate per raggiungere questo obiettivo? È qui che gli EPR entrano in gioco.
Un EPR (End Point Reference) è un puntatore a un'istanza con due informazioni: ResourceURI e SelectorSet. ResourceURI ha il nome della classe da cui viene creata l'istanza e SelectorSet elenca le proprietà con cui un'istanza può essere identificata in modo univoco. Gli EPR di una particolare classe possono essere enumerati con un comando simile a:
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>
Di tutti i processori nel sistema di destinazione, l'output precedente è di un solo processore. Nell'output, resourceURI viene elencato come http://sblim.sf.net/wbem/wscim/1/cim-schema/2/Linux_Processor e SelectorSet elenca i valori di __cimnamespace, SystemCreationClassName, SystemName, CreationClassName e DeviceID. Ciò significa che tutte le proprietà nella classe Linux_Processor (ereditate e definite localmente) possono essere utilizzate per identificare in modo univoco un'istanza.
È quindi lecito aspettarsi una risposta valida da un comando come:
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
Se nella richiesta precedente vengono utilizzate altre proprietà, CIMOM nel back-end non è in grado di identificare un'istanza in modo univoco. Analogamente, se sono presenti alcuni metodi personalizzati che devono essere eseguiti in un'istanza, è possibile utilizzare l'EPR della classe per identificare le proprietà chiave con cui richiamare un metodo.
È anche possibile enumerare gli EPR di un'associazione. Dato il nome di una classe, non è possibile capire se si tratta di un nome di classe standard o di una classe di associazione. Poiché un'istanza di un'associazione dispone di puntatori a due istanze, l'EPR di un'associazione ha gli EPR delle istanze o degli oggetti a cui fa riferimento l'associazione. Di seguito è riportato un esempio:
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 è un'associazione tra le classi
Linux_ComputerSystem e
Linux_Processor che stabilisce la relazione in base alla quale i processori sono contenuti nei sistemi di computer e quindi nelle sezioni GroupComponent e PartComponent.
Ho dovuto dedicare un po' di tempo a capire gli EPR e come possono essere utilizzati per accedere alle singole istanze, quindi ho pensato che potesse tornare utile per altri. Si invita a lasciare commenti/suggerimenti qui sotto.
Dichiarazione di non responsabilità:
Questo articolo è solo a scopo informativo. Il contenuto deriva dalla mia interpretazione delle tecnologie e delle terminologie menzionate. Queste informazioni sono fornite così come sono e potrebbero contenere alcuni errori tipografici e/o imprecisioni tecniche.