In a previous example, I gave an example of running a simple Service Management Automation runbook using REST. This blog demonstrates how to retrieve output from a called runbook by using platform independent REST calls against the SMA Server.
Four steps exist in obtaining the output from an SMA Runbook:
The code below uses PowerShell to shows the four steps required in retrieving SMA output (although the REST calls would be the same in any programming language).
[[powershell]] # Create a Credentials object $credentials = New-Object System.Management.Automation.PSCredential ("domain\username",(ConvertTo-SecureString "Password" -AsPlainText -Force)) #-------------- # Step 1. Query the SMA server for the Runbook GUID $RunbookName = $URI = "https://smaserver.domain.com:9090/00000000-0000-0000-0000-000000000000/Runbooks()?`$filter=RunbookName eq 'runbookparametersexample'" $Response = Invoke-RestMethod -Uri $URI -Method Get -Credential $credentials $StartGUIDURI = $Response.id #-------------- # Step 2. Start the runbook with Name Value pairs for inputs # * All REST inputs for SMA are as Name Value pairs submitted # as JSON $URI = “$($StartGUIDURI)/Start” $Headers = @{“Accept” = “application/atom+xml,application/xml”} $Body = @" {"parameters":[ {"__metadata":{"type":"Orchestrator.ResourceModel.NameValuePair"},"Name":"FirstName","Value":"Fred"}, {"__metadata":{"type":"Orchestrator.ResourceModel.NameValuePair"},"Name":"LastName","Value":"Flintstone"} ]} "@ $Response = Invoke-RestMethod -Uri $URI -Body $Body -Method Post -Headers $Headers -Credential $credentials -ContentType “application/json;odata=verbose” $JobGUID = $Response.Start.'#text' "JOB Id =$($JobGUID)" #----------------------- #Retrieve the status of the submitted job # Keep polling until the job status is complete $URI = "https://smaserver.domain.com:9090/00000000-0000-0000-0000-000000000000/Jobs(guid'" + $JobGUID + "')" $Response = Invoke-RestMethod -Uri $URI -Method Get -Credential $credentials $JobStatus = $Response.entry.properties.JobStatus $Status = (Invoke-RestMethod -Uri $URI -Method Get -Credential $credentials ).entry.properties.JobStatus while ($Status -ne "Completed") { "Status = $($Status)" Start-Sleep 5 $Status = (Invoke-RestMethod -Uri $URI -Method Get -Credential $credentials ).entry.properties.JobStatus } # -------------------------- # Retrieve the output streams from the Job $URI = "https://smaserver.domain.com:9090/00000000-0000-0000-0000-000000000000/JobStreams/GetStreamItems?jobId='" + $JobGUID +"'&streamType='Any' " $Result = Invoke-RestMethod -Uri $URI -Method Get -Credential $credentials "StreamText = $($Result.content.properties.StreamText.InnerText)" [[/powershell]]
Retrieving SMA output with PowerShell CMDlets
Windows hosted processes can use PowerShell CMDlets to start a runbook and retrieve the results. Cmdlets simplify the process by removing the initial step of retrieving a runbook GUID as the Start-SMARunbook activity can resolve runbook names to GUIDs automatically. The cmdlet based code below is the equivalent of the REST orientated “longhand” above.
[[powershell]] # Create a Credentials object $credentials = New-Object System.Management.Automation.PSCredential ("domain\username",(ConvertTo-SecureString "Password" -AsPlainText -Force)) # Start a Runbook Job $JobResult = Start-SmaRunbook -WebServiceEndpoint https://smaserver.domain.com -Port 9090 -Name "runbookparametersexample" -Credential $credentials -Parameters @{"FirstName"="Fred";"LastName"="Flintstone" } "Job Result $($JobResult)" Get-SmaJob -Id $JobResult -WebServiceEndpoint https://smaserver.domain.com -Port 9090 -Credential $credentials; #Poll the status of the started Job $Status = (Get-SmaJob -Id $JobResult -WebServiceEndpoint https://smaserver.domain.com -Port 9090 -Credential $credentials).JobStatus while ($Status -ne "Completed") { Start-Sleep 5 $Status = (Get-SmaJob -Id $JobResult -WebServiceEndpoint https://smaserver.domain.com -Port 9090 -Credential $credentials).JobStatus "Status = $($Status)" } # Different streams are accessible from the SMA Job - this example uses the 'any' stream # but Error, Output & Warning streams may be more appropriate depending on the # code being written "Any Stream = " Get-SmaJobOutput -Id $JobResult -WebServiceEndpoint https://smaserver.domain.com -Port 9090 -Stream Any -Credential $credentials; [[/powershell]]
See also:
Christopher Keyaert has made some useful modifications to this example - check out his reworked version of the script here: :)
- Log in to post comments
- Log in to post comments
Ignoring Self Signed Certificates