Arbeiten mit vRealize Orchestrator PowerShell Host

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

vRealize Orchestrator PowerShell Host - invoke a powershell script - Host vRealize Orchestrator PowerShell Host - invoke a powershell script - Command

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.

vRealize Orchestrator PowerShell Host - invoke a powershell script - Log

Simples Skript ausführen

vRealize Orchestrator PowerShell Host - invoke a powershell script - Script

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.

vRealize Orchestrator PowerShell Host - invoke a powershell script - Log

Variablen des Workflows

Eingabevariablen der Workflows sind recht transparent für den Nutzer, die Ausgabe jedoch ist erst einmal nicht lesbar.

vRealize Orchestrator PowerShell Host - invoke a powershell script - Variables

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

vRealize Orchestrator PowerShell Host - invoke a external script - Host vRealize Orchestrator PowerShell Host - invoke a external script - 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.

vRealize Orchestrator PowerShell Host - invoke a powershell script via API - Log

Übersicht der Methoden, welche auf das Ergebnis (PowerShellRemotePSObject) anwendbar sind:

Method

Description

getErrors()

Returns a list of errors reported by the PowerShell engine during script invocation.

getInvocationState()

Status of the script. The possible values are Completed or Failed.

getHostOutput()

Output of the script as it appears on the PowerShell console.

getResults()

Objects returned by the PowerShell engine. The returned object is of type PowershellRemotePSObject.

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:

Toggle VM State - Example

Als simples Beispiel für die Generierung  habe ich mir das Cmdlet „Get-Command“ ausgesucht.

get-command

Generierung der Action

Für die Generierung der Action wird er mitgebrachte Workflow „Generate an action for a PowerShell cmdlet“ verwendet.

vRealize Orchestrator PowerShell Host - generate an action for a powershell cmdlet - Cmdlet vRealize Orchestrator PowerShell Host - generate an action for a powershell cmdlet - Action

Das Erstellen des Workflows ist optional. Für mich aber praktisch um direkt einen Test nach der Erstellung der Action auszuführen.

vRealize Orchestrator PowerShell Host - generate an action for a powershell cmdlet - Workflow

Mehr Details zu der Generierung von Actions sind der VMware Dokumentation zu finden: Generate an Action for a PowerShell Cmdlet

Durch den Workflow generierte Elemente

generierte Action

vRealize Orchestrator PowerShell Host - generated Action

generierter Workflow

vRealize Orchestrator PowerShell Host - generated Workflow - SchemavRealize Orchestrator PowerShell Host - generated Workflow - Attributes vRealize Orchestrator PowerShell Host - generated Workflow - Parameters

Test der generierten Elemente

vRealize Orchestrator PowerShell Host - Test Workflow - Host vRealize Orchestrator PowerShell Host - Test Workflow - Script Parameters

vRealize Orchestrator PowerShell Host - Test Workflow - Logs

Leave a Reply