<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1678611822423757&amp;ev=PageView&amp;noscript=1">
Defrag This

| Read. Reflect. Reboot.

Benutzung der REST API von MOVEit 2018 zur Erstellung und zum Monitoring von Dateitransfers mit PowerShell

Adam Bertram| May 16 2018

| security, Cloud Computing, MOVEit

automate-website-to-work-for-you

Wir haben bereits Swagger UI behandelt und wie man PowerShell benutzen kann, um zur REST API von MOVEit Automation zu authentifizieren. In diesem Artikel wird das nun in praktischen Anwendungsfällen angewandt, in denen die REST API von MOVEit Automation verwendet wird, um Tasks zu erstellen und zu überwachen.

In diesem Anwendungsfall möchte ich einige Dateien aus einem Ordner in einen Amazon S3 Bucket hochladen, einer von MOVEit Automations neu erhältlichen Hosttypen. Auf der Webadmin Tasks Seite sieht das so aus:

betram

Das wurde über die Webadmin-Seite erstellt - nun sehen wir, wie man das über die REST API machen kann!

Authentifizierung

Mit den Tricks aus einem vorherigen Artikel über die Authentifizierung zur MOVEit Automation REST API erstelle ich schnell ein PowerShell-Skript, um einen Zugangs-Token zu erhalten.

$cred = Import-CliXml -Path 'C:\MOVEitAutomationCred.xml'
$apiConfig = @{
    UserName = $cred.UserName
    Password = $cred.GetNetworkCredential().Password
    GrantType = 'password'
    MoveItHost = '<YourMOVEitAutomationServerNameHere>'
}
$authEndpointUrl = "https://$($apiConfig.MoveItHost)/webadmin/api/v1/token"
$authHttpBody = "grant_type=$($apiConfig.GrantType)&username=$($apiConfig.UserName)&password=$($apiConfig.Password)"
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
$token = Invoke-RestMethod  -Uri $authEndpointUrl -Method 'POST' -Body $authHttpBody
$token = $token.access_token
$authParam = @{
    Headers = @{ 'Authorization' = "Bearer $token" }
}

Einen Task erstellen

Es sei denn, man ist ein MOVEit Automation REST API-Experte und kennt alle APIs und Methoden auswendig, ist es eine gute Idee die Swagger UI zu benutzen. Mit der Swagger UI kann man interaktiv herumspielen und sehen, welche APIs benötigt werden und wie man sie rufen kann.

Nutzen Sie erweiterte Workflow-Automatisierung ohne Skripting-Kenntnisse.  Testen Sie MOVEit Automation kostenfrei.

In den vorhandenen APIs in Swagger gibt es eine Operation, die genau richtig für meine Zwecke aussieht. Die Beschreibung "adds a new task" ist wohl selbsterklärend.

Wenn ich hineinklicke, sehe ich, dass der API JSON gegeben werden muss, das den Task, welcher erstellt wird, repräsentieren wird. Mit Hilfe des zur Verfügung gestellten JSON Beispiels habe ich JSON-Code geschrieben, welcher den Task repräsentiert, den ich ausführen möchte.

{
    "Info": {
        "Description": "This task moves some files locally to an AWS S3 bucket on demand."
    },
    "steps": [
        {
            "Source": {
                "HostID": "0",
                "Path": "C:\\Temp",
                "Type": "FileSystem"
            }
        },
        {
            "Destination": {
                "HostID": "730111199",
                "Type": "S3"
            }
        }
    ],
    "Name": "Copy Files to S3 Bucket",
    "Active": 1
}

Das so erstellte JSON kopiere ich in eine Datei namens C:\DemoTask.json auf meinem lokalen Computer und gebe die entsprechenden Parameter an Invoke-RestMethod. Um all die JSON-Daten an die API zu geben, benutze ich Get-Content -Raw und gebe den Weg zur Datei an. Auch muss der ContentType-Paramter angegeben werden, sonst kann die API nicht verstehen, dass der Body tatsächlich JSON ist.

$taskEndpoint = "https://$($apiConfig.MoveItHost)/webadmin/api/v1/tasks"
Invoke-RestMethod @authParam -Uri $taskEndpoint -Method POST -Body (Get-Content -Raw -Path 'C:\DemoTask.json') -ContentType 'application/json'

Info               : @{Description=This task moves some files locally to an AWS S3 bucket on demand.; Notes=}
NextActions        : @{NextAction=System.Object[]}
Schedules          : @{Schedule=System.Object[]}
steps              : {@{Source=}, @{Destination=}}
Group              : {}
ID                 : 475167498
Name               : Copy Files to S3 Bucket
Active             : 1
AR                 : 0
CacheNames         : random
NextEID            : 13
TT                 :
UseDefStateCaching : 1

Den Task beginnen

Da der Task nun erstellt ist, müssen wir ihn starten. Dafür muss ich erst einmal die ID von dem Task, den ich gerade erstellt habe, finden. Wenn ich dies im gleichen Skript machen würde, dann könnte ich die ID einfach von dem Output holen, wenn ein neuer Task erstellt wird, aber das ist meistens nicht der Fall. In den meisten Fällen wird der Task von einem anderen Skript aus gestartet.

Um die Task-ID zu finden, muss ich die Task-API wieder abfragen, aber dieses Mal benutze ich eine GET-Methode, um existierende Tasks zu erhalten. Da ich nicht alle Tasks sehen will, sondern nur das eine, mit dem wir gerade arbeiten, kann ich den name HTTP-Parameter benutzen und den Namen von dem Task angeben.

$taskName = 'Copy Files to S3 Bucket'
$httpQueryString = "?name=$taskName"
$getUri = "{0}{1}" -f $taskEndpoint,$httpQueryString
$task = Invoke-RestMethod @authParam -Uri $getUri -Method GET

Nun sind die Task-Eigenschaften in der Variablen $task repräsentiert und ich kann ganz einfach die ID finden, indem ich nach dem Wert $task.items.ID suche.

Wenn ich diese Task-ID habe, kann ich sie zur Task-API geben und das Start-Attribut referenzieren. Wenn der Task angefangen hat, werden Sie eine Eigenschaft namens nominalStart erhalten, die die Zeit repräsentiert, zu der der Task anfing.

$taskId = $task.items.ID
$startTaskUri = '{0}/{1}/start' -f $taskEndpoint,$taskId
$startTaskResp = Invoke-RestMethod @authParam -Uri $startTaskUri -Method POST -ContentType 'application/json'
$startTaskResp

nominalStart
------------
2018-03-16 18:53:00.05

Überwachung des Task

Wie lange das Task braucht, hängt davon ab, wieviele Dateien in dem Ordner sind. Wir können den Task also beginnen und das PowerShell-Skript laufen lassen. Was aber, wenn es eine Abhängigkeit zu dem Resultat von dem Task gibt? Hier gibt es möglicherweise weitere Automation im Skript, die etwas mit den Dateien im S3-Bucket macht. In diesem Fall müssen wir den Task überwachen, während er läuft und mit der weiteren Skript-Ausführung warten, bis er beendet ist. Dies kann man mit einer PowerShell while loop und der MOVEit Automation Reports API machen.

Den Status eines laufenden Tasks kann man über das Attribut taskruns erhalten. Man weist Variablen zu den URIs zu, erstellt einige Abfragen und mit Hilfe der Invoke-RestMethod beginnt man einen neuen API-Aufruf, um einen taskruns Report anzufangen.

$reportsEndpoint = 'https://{0}/webadmin/api/v1/reports' -f $apiConfig.MoveItHost
$taskRunsUri = '{0}/taskruns' -f $reportsEndpoint

$predicate = "taskid==$taskId; nominalStart=='$($startTaskResp.nominalStart)'"
$query =  @{ 'maxCount' = 15; 'orderBy'="!StartTime"; 'predicate' = $predicate }

$report = Invoke-RestMethod @authParam -Uri $taskRunsUri -Method POST -Body ($query | ConvertTo-Json) -ContentType 'application/json'

$report.items


ScheduledTime : 2018-03-16T19:14:05.46
TaskID        : 642900281
TaskName      : Copy Files to S3 Bucket
Node          : 0
NominalStart  : 2018-03-16 19:14:05.46
StartedBy     : MIAdmin
LogStamp      : 2018-03-16T19:14:05.46
StartTime     : 2018-03-16T19:14:05.46
RecType       : start
RunID         : 70
QueryType     : TaskRuns

So kann man gute Informationen bekommen, aber nur von einem bestimmten Zeitpunkt. Nun muss man den Status von diesem Task immer wieder kontrollieren bis er beendet ist.

Sie können sehen, dass keine von den Informationen, die die API zurückgegeben hat, der Status von dem Task war. Den brauchen wir aber, um zu sehen, ob der Task fertig ist oder nicht. Das Status–Attribut gibt es leider erst, wenn der Task fertig ist, aber das ist kein Problem mit PowerShell!

$reportParams = $authParam + @{
    Uri = $taskRunsUri
    Method = 'POST'
    Body = ($query | ConvertTo-Json)
    ContentType = 'application/json'
}
while ('Status' -notin (Invoke-RestMethod @reportParams).items.PSObject.Properties.Name) {
    Write-Host 'Waiting for task to complete...'
    Start-Sleep -Seconds 5
}

Wenn dieses Skript angestoßen wird, wartet es, bis der Task entweder scheitert oder erfolgreich beendet ist, und wird solange anzeigen, dass der Task noch läuft.

Waiting for task to complete...
Waiting for task to complete...

Automatisieren Sie Ihre Dateitransfer-Workflows. Jetzt MOVEit Automation  kostenfrei testen.

Topics: security, Cloud Computing, MOVEit

Leave a Reply

Your email address will not be published. Required fields are marked *

THIS POST WAS WRITTEN BY Adam Bertram

Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.

Free Trials

Getting started has never been easier. Download a trial today.

Download Free Trials

Contact Us

Let us know how we can help you. Focus on what matters. 

Send us a note

Subscribe to our Blog

Let’s stay in touch! Register to receive our blog updates.