In einem früheren Artikel habe ich die Einbindung eines Windows PowerShell Host in den VMware vRealize Orchestrator aufgezeigt. Nun möchte ich das Arbeiten mit einem vRealize Orchestrator PowerShell Host genauer aufzeigen.
Nur ein simples Skript oder einen einzelnes Befehl (Cmdlet) auszuführen ist Out-of-the-Box sehr einfach. Jedoch hilft einem das in der Praxis nicht sehr viel, es muss mindestens das Ergebnis geprüft werden. Meistens muss aber auch mit den Ergebnissen weitergearbeitet werden oder diese übergeben werden.
Arbeiten mit vRealize Orchestrator PowerShell Host – Die Themen
- Befehle oder Skripte ausführen
- Externe Skripte ausführen
- Arbeiten mit den Rückgabe
- PowerShell Skript Ergebnis prüfen
- Action aus PowerShell Cmdlet erstellen
Befehle oder Skripte Ausführen
Um einfach nur PowerShell Befehle oder ein kleines Skript auf einem vRealize Orchestrator PowerShell Host auszuführen bietet es sich an, den vom PowerShell Plug-in mitgebrachten Workflow „Invoke a PowerShell Script“ zu nutzen.
Weitere Infos aus der VMware Doku: Invoke a PowerShell Script
Simplen Befehl ausführen
Die Log Ausgabe ist identisch mit der Ausgabe in der Konsole des vRealize Orchestrator PowerShell Host (Methode: getHostOutput()). Weiter arbeiten kann man jedoch mit dem Konsolen Log nicht, dazu aber später mehr.
Simples Skript ausführen
Das Skript hat trotz erfolgreicher Ausführung, by Design keine Rückgabe. Dies ist jedoch etwas schwierig, wenn z.B. auf Erfolg geprüft werden soll. Dazu aber ebenfalls in einem späteren Kapitel mehr.
Variablen des Workflows
Eingabevariablen der Workflows sind recht transparent für den Nutzer, die Ausgabe jedoch ist erst einmal nicht lesbar.
Externes Skript ausführen
Als Alternative zu der direkten Ausführung des Skripts aus dem Workflow heraus, kann auch auf ein Skript auf dem vRealize Orchestrator PowerShell Host verwiesen werden. Diese Methode erachte ich als sinnvoll, wenn das Skript nicht nur vom vRealize Orchestrator verwendet wird und damit auch extern gepflegt wird.
Weitere Infos aus der VMware Doku: Invoke an External Script
Arbeiten mit den Rückgaben
Ich habe für dieses Kapitel das vorherige Beispiel der Windows Dienste erneut aufgegriffen. Das folgende Skript wird wieder mit „Get-Service“ alle Dienste auflisten, dann aber in JavaScript auswerten. Konkret sollen nur laufende Dienste ausgegeben werden.
var Session; try { //Open Sessionion to PowerShell host var Session = PS_Host.openSession() //Set executed script var Result = Session.invokeScript('Get-Service') //Check for errors System.log("Result: " + Result.invocationState ); if (Result.invocationState == 'Failed'){ throw "PowerShellInvocationError: Errors found while executing script \n" + Result.getErrors(); } //Show Result System.log( Result.getHostOutput() ); } catch (ex){ System.error (ex) } finally { if (Session) { //Close Session PS_Host.closeSession( Session.getSessionId() ); } } //Get PowerShellRemotePSObject var psObject = Result.getResults(); var Services = psObject.getRootObject(); var isList = Services instanceof Array if ( isList ){ for (i in Services){ var item = Services[i]; if (item.getProperty('Status').getToString() == 'Running'){ System.log( item.getProperty('Name') );//Extract value from result } } } else { System.log( Services.getProperty('Name') );//Extract value from result }
Zeile 1-22: PowerShell Skript ausführen und auf Fehler prüfen
Zeile 24-38: Ergebnis Aufbereiten
[2016-11-09 14:25:17.049] [I] Result: Completed [2016-11-09 14:25:17.056] [I] Status Name DisplayName ------ ---- ----------- Running ADWS Active Directory Web Services Stopped AJRouter AllJoyn Router Service Stopped ALG Application Layer Gateway Service Stopped AppIDSvc Application Identity Stopped Appinfo Application Information Stopped AppMgmt Application Management Stopped AppReadiness App Readiness Stopped AppVClient Microsoft App-V Client Stopped AppXSvc AppX Deployment Service (AppXSVC) Stopped AudioEndpointBu... Windows Audio Endpoint Builder Stopped Audiosrv Windows Audio Stopped AxInstSV ActiveX Installer (AxInstSV) Running BFE Base Filtering Engine ... Running WPDBusEnum Portable Device Enumerator Service Running WpnService Windows Push Notifications System S... Stopped WSearch Windows Search Running wuauserv Windows Update Running wudfsvc Windows Driver Foundation - User-mo... Stopped XblAuthManager Xbox Live Auth Manager Stopped XblGameSave Xbox Live Game Save [2016-11-09 14:25:17.217] [I] ADWS [2016-11-09 14:25:17.222] [I] BFE ... [2016-11-09 14:25:17.411] [I] WPDBusEnum [2016-11-09 14:25:17.415] [I] WpnService [2016-11-09 14:25:17.418] [I] wuauserv [2016-11-09 14:25:17.421] [I] wudfsvc
PowerShell Skript Ergebnis prüfen
Hier greife ich ebenfalls ein früheres Beispiel auf, es soll wieder das Windows Eventlog gelöscht werden.
PowerShell Script:
foreach ($log in (get-eventlog -list).Log) { clear-eventlog -log $log }
PowerShell Script in vRealize Orchestrator eingebunden:
var Session; var Script = ' foreach ($log in (get-eventlog -list).Log) { \r\n' + 'clear-eventlog -log $log \r\n' + ' } \r\n'; try { //Open Sessionion to PowerShell host var Session = PS_Host.openSession() //Set executed script var Result = Session.invokeScript(Script) //Check for errors System.log("Result: " + Result.invocationState ); if (Result.invocationState == 'Failed'){ throw "PowerShellInvocationError: Errors found while executing script \n" + Result.getErrors(); } //Show Result System.log( Result.getHostOutput() ); } catch (ex){ System.error (ex) } finally { if (Session) { //Close Session PS_Host.closeSession( Session.getSessionId() ); } }
Durch die Ausgabe „System.log(„Result: “ + Result.invocationState );“ wird auch das Ergebnis des PowerShell Skripts sichtbar.
Übersicht der Methoden, welche auf das Ergebnis (PowerShellRemotePSObject) anwendbar sind:
Quelle: Working with PowerShell Results
Action aus PowerShell Cmdlet erstellen
Wenn ein Cmdlet mehrfach verwendet werden wird, macht es Sinn diese als Action mit seinen Parametern als Input zur Verfügung zu haben. Ein weiterer Vorteil ist, mehrere Actions lassen sich viel schneller in übergreifende Workflows einbinden und innerhalb einer PowerShell Session aufrufen.
Ein gutes Beispiel für eine solche Verwendung ist der „Toggle VM State“ Beispiel Workflow aus dem Plug-In:
Als simples Beispiel für die Generierung habe ich mir das Cmdlet „Get-Command“ ausgesucht.
Generierung der Action
Für die Generierung der Action wird er mitgebrachte Workflow „Generate an action for a PowerShell cmdlet“ verwendet.
Mehr Details zu der Generierung von Actions sind der VMware Dokumentation zu finden: Generate an Action for a PowerShell Cmdlet