<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.

Utilisation de l'API REST de MOVEit 2018 pour créer et surveiller les transferts de fichiers avec PowerShell

Adam Bertram| May 24 2018

| security, MOVEit, API REST

automate-website-to-work-for-you

Nous avons déjà abordé l'interface utilisateur Swagger et vu comment utiliser PowerShell pour procéder à une authentification dans l'API REST de MOVEit Automation. Dans cet article, nous allons reprendre ce que nous avons appris et examiner quelques cas d'utilisation pratiques utilisant l'API REST de MOVEit Automation, à savoir la création et la surveillance de tâches.

Pour ce cas d'utilisation, j'ai toute une série de fichiers dans un dossier et je souhaite transférer l'ensemble de ces fichiers vers un Bucket Amazon S3, l'un des nouveaux types d'hôtes disponibles dans MoveIt Automation. La page des tâches de l'administration Web apparaît comme suit :

betram

Ceci a été créé depuis la page d'administration Web. Voyons comment nous pouvons le faire via l'API REST !

Authentification

En reprenant notre précédent article sur la façon de procéder à l'authentification dans l'API REST de MOVEit Automation, je vais rapidement créer un objet PowerShell pour obtenir un jeton d'accès.

$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" }
}

Création de la tâche

Je pars du principe que vous n'êtes pas un expert de l'API REST de MOVEit Automation et n'avez pas en mémoire l'ensemble des API et méthodes. C'est pourquoi il est toujours judicieux d'utiliser l'interface utilisateur de Swagger. L'interface utilisateur de Swagger nous permettra de jouer de façon interactive, de déterminer les API nécessaires et de savoir comment les appeler.

Automatisez vos flux de travail. Téléchargez une version d’évaluation de  MOVEit Automation

Lorsque j'examine les API disponibles depuis Swagger, je remarque une opération qui ressemble exactement à ce dont j'ai besoin. La description « adds a new task » (ajoute une nouvelle tâche) parle d'elle-même.

Lorsque je clique dessus, je constate que je vais devoir indiquer l'API avec un objet JSON représentant la tâche que je souhaite créer. À partir de l'exemple d'objet JSON fourni, j'ai réussi à créer un objet JSON représentant la tâche que je souhaite créer.

{
    "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
}

Maintenant que j'ai créé l'objet JSON, je vais copier cet objet JSON dans un fichier appelé C:\DemoTask.json en local sur mon ordinateur, puis transmettre les paramètres appropriés à Invoke-RestMethod. Pour transmettre toutes les données JSON à l'API, j'utilise Get-Content -Raw et je précise le chemin d'accès vers le fichier. Par ailleurs, le paramètre ContentType est obligatoire, sans quoi l'API ne pourra pas comprendre que le corps est, en fait, JSON.

$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

Démarrage de la tâche

Maintenant que la tâche a été créée, démarrons-la. Pour ce faire, je dois d'abord trouver l'identifiant de la tâche que je viens de créer. Si je faisais cela dans le même script, je pourrais me contenter de récupérer l'identifiant dans le résultat au moment de la création d'une nouvelle tâche. Mais ce n'est pas le cas. La plupart du temps, un autre script démarre la tâche.

Pour trouver l'identifiant de la tâche, je vais devoir à nouveau interroger l'API Tasks, mais cette fois je vais utiliser une méthode GET pour récupérer les tâches existantes. Comme je ne veux pas voir toutes les tâches mais uniquement la tâche avec laquelle nous travaillons, je peux utiliser le paramètre name HTTP et préciser le nom de la tâche.

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

J'ai maintenant les propriétés de tâche représentées dans la variable $task et peux facilement trouver l'identifiant en examinant la variable $task.items.IDvalue.

Une fois que je dispose de l'identifiant de la tâche, je peux transmettre cet identifiant à l'API Tasks en faisant référence à l'attribut de démarrage. Une fois la tâche démarrée, une propriété appelée nominalStart est renvoyée. Elle représente l'heure de démarrage de la tâche.

$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

Surveillance de la tâche

Selon le nombre de fichiers présents dans le dossier, la tâche peut être plus ou moins longue. En l'état, nous allons démarrer la tâche et le script PowerShell continuera d'être exécuté. Mais que se passe-t-il si nous avons une sorte de dépendance au résultat de cette tâche ? Dans cette instance, nous avons peut-être davantage d'automatisation dans ce script qui a un impact sur ces fichiers dans le Bucket S3. Dans ce cas, nous devons surveiller la tâche pendant son exécution et suspendre toute exécution de script tant que la tâche n'est pas terminée. Nous pouvons faire cela en utilisant une boucle « while » PowerShell et l'API Reports de MOVEit Automation.

Nous pouvons obtenir le statut des tâches en cours d'exécution au moyen de l'attribut taskruns. Encore une fois, nous allons attribuer les variables aux URI, créer quelques requêtes et, au moyen de Invoke-RestMethod, lancer un autre appel d'API pour générer un rapport taskruns.

$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

Nous avons ici réussi à obtenir de bonnes informations. Mais c'est juste à un moment précis dans le temps. Nous allons devoir vérifier l'état de cette tâche en permanence, jusqu'à ce qu'elle soit terminée.

Vous voyez que l'API a renvoyé quelques informations mais aucune d'entre elles ne correspondait au statut de la tâche. Nous en avons besoin pour déterminer l'état de la tâche, afin de savoir si elle est terminée ou non. Malheureusement, l'attribut de statut n'existe pas réellement tant que la tâche est en cours d'en cours d'exécution. Mais ce n'est pas un problème avec 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
}

Lorsque ce script est lancé, il attend que la tâche réussisse ou échoue et nous indique que la tâche est toujours en cours d'exécution.

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

Automatisez vos flux de travail sans devoir recourir à des scripts. Testez  MOVEit Automation

Topics: security, MOVEit, API REST

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.