Tester une image de machine virtuelle

Cet article explique comment tester une image de machine virtuelle afin de s’assurer qu’elle répond aux dernières exigences de publication de la Place de marché Azure.

Déployer une machine virtuelle Azure

Pour déployer une machine virtuelle à partir de l’image Azure Compute Gallery (anciennement Galerie d’images partagées) :

  1. Ouvrez la version de l’image Azure Compute Gallery.
  2. Sélectionnez Créer une machine virtuelle.
  3. Fournissez un nom de machine virtuelle et sélectionnez une taille de machine virtuelle.
  4. Sélectionnez Revoir + créer. Une fois la validation réussie, sélectionnez Créer.

Remarque

Pour créer une machine virtuelle à partir d’un fichier vhd, suivez les instructions ci-dessous sous Connecter l’outil de certification à une image de machine virtuelle ou Utilisation de PowerShell pour consommer l’API d’autotest.

Effectuez les étapes suivantes avant d’envoyer votre offre de machine virtuelle :

Effectuer les validations

Il existe deux façons d’effectuer des validations sur l’image déployée.

Utiliser l’outil Certification Test Tool for Azure Certified

Important

Pour exécuter l’outil de test de certification, le service Windows Remote Management doit être en cours d’exécution et configuré sur Windows. Cela permet d’accéder au port 5986. Pour plus d’informations, consultez Installation et configuration de Windows Remote Management.

Télécharger et exécuter l’outil Certification Test

L’outil Certification Test Tool for Azure Certified s’exécute sur une machine Windows locale, mais teste une machine virtuelle Windows ou Linux basée sur Azure. Il vérifie que votre image de machine virtuelle utilisateur peut être utilisée avec Microsoft Azure, autrement dit que les recommandations et conditions requises de la préparation de votre VHD ont été satisfaites.

  1. Téléchargez et installez la version la plus récente de l’outil Certification Test Tool for Azure Certified.
  2. Ouvrez l’outil de certification, puis sélectionnez Démarrer un nouveau test.
  3. Dans l’écran Informations sur le test, entrez un nom de test pour l’exécution du test.
  4. Sélectionnez la plateforme pour votre machine virtuelle, Windows Server (autoriser le port 5986 pour Windows) ou Linux (autoriser le port 22 pour Linux). La plateforme que vous choisissez a une incidence sur le reste des options.
  5. Si votre machine virtuelle utilise ce service de base de données, cochez la case Test pour Azure SQL Database.

Connecter l’outil de certification à une image de machine virtuelle

  1. Sélectionnez le mode d’authentification SSH : Authentification par mot de passe ou authentification de fichier de clé.

  2. Si vous utilisez une authentification par mot de passe, renseignez les champs Nom du DNS de machine virtuelle, Nom d’utilisateur et Mot de passe. Vous pouvez également modifier la valeur par défaut du champ SSH Port (Port SSH).

    Shows the selection of VM test information.

  3. Si vous utilisez l’authentification par fichier de clé, renseignez les champs VM DNS Name (Nom du DNS de machine virtuelle), User Name (Nom d’utilisateur) et Private key (Clé privée). Vous pouvez également renseigner le champ Passphrase (Phrase secrète) ou modifier la valeur par défaut du champ SSH Port (Port SSH).

  4. Saisissez le nom DNS complet de la machine virtuelle (par exemple, MyVMName.Cloudapp.net).

  5. Saisissez le nom d’utilisateur et le mot de passe.

    Shows the selection of VM user name and password.

  6. Cliquez sur Suivant.

Exécuter un test de certification

Après avoir fourni les valeurs des paramètres pour votre image de machine virtuelle dans l’outil de certification, sélectionnez Tester la connexion pour créer une connexion valide vers votre machine virtuelle. Une fois la connexion vérifiée, sélectionnez Next (Suivant) pour démarrer le test. Une fois le test terminé, les résultats s’affichent dans un tableau. La colonne Status (État) affiche Pass/Fail/Warning (Réussite/Échec/Avertissement) pour chaque test. Si l’un des tests échoue, votre image n’est pas certifiée. Dans ce cas, examinez les exigences et les messages d’échec, apportez les modifications suggérées, puis réexécutez le test.

Une fois le test automatisé terminé, fournissez des informations supplémentaires sur votre image de machine virtuelle sous les deux onglets de l’écran Questionnaire que sont General Assessment (Évaluation générale) et Kernel Customization (Personnalisation du noyau), puis sélectionnez Next (Suivant).

Le dernier écran vous permet de fournir des informations supplémentaires, telles que les informations d’accès SSH pour une image de machine virtuelle Linux, ainsi qu’une explication des éventuels échecs d’évaluation si vous recherchez des exceptions.

Enfin, sélectionnez Generate Report (Générer le rapport) afin de télécharger les résultats de test et les fichiers journaux pour les cas de test exécutés, ainsi que vos réponses au questionnaire.

Remarque

peu d’éditeurs ont des scénarios dans lesquels les machines virtuelles doivent être verrouillées, car des logiciels tels que des pare-feu sont installés sur la machine virtuelle. Dans ce cas, téléchargez l’outil de test certifié ici et envoyez le rapport dans l’espace partenaires support.

Utilisation de PowerShell pour consommer l’API d’autotest

Sur le système d’exploitation Linux

Appelez l’API dans PowerShell :

  1. Générez le jeton d’accès.
  2. Utilisez la commande Invoke-WebRequest pour appeler l’API.
  3. La méthode est POST et le type de contenu est JSON, comme illustré dans la capture d’écran et l’exemple de code suivants.
  4. Spécifiez les paramètres de corps au format JSON.

Les commandes suivantes génèrent un jeton d’accès :

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", "application/x-www-form-urlencoded")
$body = "grant_type=client_credentials&client_id=$clientId&client_secret=$clientSecret&resource=https%3A%2F%2Fmanagement.core.windows.net"
$response = Invoke-RestMethod "https://login.microsoftonline.com/$tenantId/oauth2/token" -Method 'POST' -Headers $headers -Body $body
$accessToken = $response.access_token

Shows a screen example for generating an access token in PowerShell.

Cet exemple montre un appel PowerShell à l’API (autoriser le port 22 lors de la création de la machine virtuelle) :

$accesstoken = "token"
$headers = @{ "Authorization" = "Bearer $accesstoken" }
$DNSName = "<Machine DNS Name>"
$UserName = "<User ID>"
$Password = "<Password>"
$OS = "Linux"
$PortNo = "22"
$CompanyName = "ABCD"
$AppId = "<Application ID>"
$TenantId = "<Tenant ID>"

$body = @{
   "DNSName" = $DNSName
   "UserName" = $UserName
   "Password" = $Password
   "OS" = $OS
   "PortNo" = $PortNo
   "CompanyName" = $CompanyName
   "AppId" = $AppId
   "TenantId" = $TenantId
} | ConvertTo-Json

$body

$uri = "https://isvapp.azurewebsites.net/selftest-vm"

$res = (Invoke-WebRequest -Method "Post" -Uri $uri -Body $body -ContentType "application/json" -Headers $headers).Content


Voici un exemple d’appel de l’API dans PowerShell :

Screen example for calling the API in PowerShell.


À l’aide de l’exemple précédent, vous pouvez récupérer le fichier JSON et l’analyser pour obtenir les détails suivants :

$resVar = $res | ConvertFrom-Json
$actualresult = $resVar.Response | ConvertFrom-Json

Write-Host "OSName: $($actualresult.OSName)"
Write-Host "OSVersion: $($actualresult.OSVersion)"
Write-Host "Overall Test Result: $($actualresult.TestResult)"

For ($i = 0; $i -lt $actualresult.Tests.Length; $i++) {
   Write-Host "TestID: $($actualresult.Tests[$i].TestID)"
   Write-Host "TestCaseName: $($actualresult.Tests[$i].TestCaseName)"
   Write-Host "Description: $($actualresult.Tests[$i].Description)"
   Write-Host "Result: $($actualresult.Tests[$i].Result)"
   Write-Host "ActualValue: $($actualresult.Tests[$i].ActualValue)"
}


Cet exemple d’écran, qui affiche $res.Content, montre les détails de vos résultats de test au format JSON :

Screen example for calling the API in PowerShell with details of test results.


Voici un exemple de résultats de test JSON affichés dans une visionneuse JSON en ligne (par exemple, Code Beautify ou Visionneuse JSON).

More test results in an online JSON viewer.

Sur le système d’exploitation Windows

Appelez l’API dans PowerShell :

  1. Utilisez la commande Invoke-WebRequest pour appeler l’API.
  2. La méthode est POST et le type de contenu est JSON, comme illustré dans la capture d’écran et l’exemple de code suivants.
  3. Créez les paramètres de corps au format JSON.

Cet exemple de code montre un appel PowerShell à l’API (autoriser le port 5986 lors de la création de la machine virtuelle) :

$accesstoken = "Get token for your Client AAD App"
$headers = @{ "Authorization" = "Bearer $accesstoken" }
$Body = @{ 
   "DNSName" = "XXXX.westus.cloudapp.azure.com"
   "UserName" = "XXX"
   "Password" = "XXX@123456"
   "OS" = "Windows"
   "PortNo" = "5986"
   "CompanyName" = "ABCD"
   "AppId" = "XXXX-XXXX-XXXX"
   "TenantId" = "XXXX-XXXX-XXXX"
} | ConvertTo-Json

$res = Invoke-WebRequest -Method "Post" -Uri $uri -Body $Body -ContentType "application/json" –Headers $headers;
$Content = $res | ConvertFrom-Json

Ces captures d’écran montrent un exemple d’appel de l’API dans PowerShell :

Avec clé SSH :

Calling the API in PowerShell with an SSH Key.

Avec mot de passe :

Calling the API in PowerShell with a password.


À l’aide de l’exemple précédent, vous pouvez récupérer le fichier JSON et l’analyser pour obtenir les détails suivants :

$resVar = $res | ConvertFrom-Json
$actualresult = $resVar.Response | ConvertFrom-Json

Write-Host "OSName: $($actualresult.OSName)"
Write-Host "OSVersion: $($actualresult.OSVersion)"
Write-Host "Overall Test Result: $($actualresult.TestResult)"

For ($i = 0; $i -lt $actualresult.Tests.Length; $i++) {
   Write-Host "TestID: $($actualresult.Tests[$i].TestID)"
   Write-Host "TestCaseName: $($actualresult.Tests[$i].TestCaseName)"
   Write-Host "Description: $($actualresult.Tests[$i].Description)"
   Write-Host "Result: $($actualresult.Tests[$i].Result)"
   Write-Host "ActualValue: $($actualresult.Tests[$i].ActualValue)"
}


Cet écran, qui affiche $res.Content, montre les détails de vos résultats de test au format JSON :

Details of test results in JSON format.


Voici un exemple de résultats de test affichés dans une visionneuse JSON en ligne (par exemple, Code Beautify ou Visionneuse JSON).

Test results in an online JSON viewer.

Utiliser CURL pour consommer l’API d’autotest sur le système d’exploitation Linux

Dans cet exemple, curl sera utilisé pour effectuer un appel d’API POST à Microsoft Entra ID et à la machine virtuelle auto-hôte.

  1. Demander un jeton Microsoft Entra pour s’authentifier auprès d’une machine virtuelle auto-hôte

    Vérifiez que les valeurs correctes sont remplacées dans la demande curl.

    curl --location --request POST 'https://login.microsoftonline.com/{TENANT_ID}/oauth2/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=client_credentials' \
    --data-urlencode 'client_id={CLIENT_ID} ' \
    --data-urlencode 'client_secret={CLIENT_SECRET}' \
    --data-urlencode 'resource=https://management.core.windows.net'
    

    Voici un exemple de réponse de la demande :

    {
        "token_type": "Bearer",
        "expires_in": "86399",
        "ext_expires_in": "86399",
        "expires_on": "1599663998",
        "not_before": "1599577298",
        "resource": "https://management.core.windows.net",
        "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJS…"
    }
    
  2. Envoyer une demande pour la machine virtuelle d’auto-test

    Vérifiez que le jeton du porteur et les paramètres sont remplacés par les valeurs correctes.

    curl --location --request POST 'https://isvapp.azurewebsites.net/selftest-vm' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJS…' \
    --data-raw '{
        "DNSName": "avvm1.eastus.cloudapp.azure.com",
        "UserName": "azureuser",
        "Password": "SECURE_PASSWORD_FOR_THE_SSH_INTO_VM",
        "OS": "Linux",
        "PortNo": "22",
        "CompanyName": "COMPANY_NAME",
        "AppId": "CLIENT_ID_SAME_AS_USED_FOR_AAD_TOKEN ",
        "TenantId": "TENANT_ID_SAME_AS_USED_FOR_AAD_TOKEN"
    }'
    

    Exemple de réponse de l’appel d’API de la machine virtuelle d’autotest :

    {
        "TrackingId": "9bffc887-dd1d-40dd-a8a2-34cee4f4c4c3",
        "Response": "{\"SchemaVersion\":1,\"AppCertificationCategory\":\"Microsoft Single VM Certification\",\"ProviderID\":\"050DE427-2A99-46D4-817C-5354D3BF2AE8\",\"OSName\":\"Ubuntu 18.04\",\"OSDistro\":\"Ubuntu 18.04.5 LTS\",\"KernelVersion\":\"5.4.0-1023-azure\",\"KernelFullVersion\":\"Linux version 5.4.0-1023-azure (buildd@lgw01-amd64-053) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #23~18.04.1-Ubuntu SMP Thu Aug 20 14:46:48 UTC 2020\\n\",\"OSVersion\":\"18.04\",\"CreatedDate\":\"09/08/2020 01:13:47\",\"TestResult\":\"Pass\",\"APIVersion\":\"1.5\",\"Tests\":[{\"TestID\":\"48\",\"TestCaseName\":\"Bash History\",\"Description\":\"Bash history files should be cleared before creating the VM image.\",\"Result\":\"Passed\",\"ActualValue\":\"No file Exist\",\"RequiredValue\":\"1024\"},{\"TestID\":\"39\",\"TestCaseName\":\"Linux Agent Version\",\"Description\":\"Azure Linux Agent Version 2.2.41 and above should be installed.\",\"Result\":\"Passed\",\"ActualValue\":\"2.2.49\",\"RequiredValue\":\"2.2.41\"},{\"TestID\":\"40\",\"TestCaseName\":\"Required Kernel Parameters\",\"Description\":\"Verifies the following kernel parameters are set console=ttyS0, earlyprintk=ttyS0, rootdelay=300\",\"Result\":\"Warning\",\"ActualValue\":\"Missing Parameter: rootdelay=300\\r\\nMatched Parameter: console=ttyS0,earlyprintk=ttyS0\",\"RequiredValue\":\"console=ttyS0#earlyprintk=ttyS0#rootdelay=300\"},{\"TestID\":\"41\",\"TestCaseName\":\"Swap Partition on OS Disk\",\"Description\":\"Verifies that no Swap partitions are created on the OS disk.\",\"Result\":\"Passed\",\"ActualValue\":\"No. of Swap Partitions: 0\",\"RequiredValue\":\"swap\"},{\"TestID\":\"42\",\"TestCaseName\":\"Root Partition on OS Disk\",\"Description\":\"It is recommended that a single root partition is created for the OS disk.\",\"Result\":\"Passed\",\"ActualValue\":\"Root Partition: 1\",\"RequiredValue\":\"1\"},{\"TestID\":\"44\",\"TestCaseName\":\"OpenSSL Version\",\"Description\":\"OpenSSL Version should be >=0.9.8.\",\"Result\":\"Passed\",\"ActualValue\":\"1.1.1\",\"RequiredValue\":\"0.9.8\"},{\"TestID\":\"45\",\"TestCaseName\":\"Python Version\",\"Description\":\"Python version 2.6+ is highly recommended. \",\"Result\":\"Passed\",\"ActualValue\":\"2.7.17\",\"RequiredValue\":\"2.6\"},{\"TestID\":\"46\",\"TestCaseName\":\"Client Alive Interval\",\"Description\":\"It is recommended to set ClientAliveInterval to 180. On the application need, it can be set between 30 to 235. \\nIf you are enabling the SSH for your end users this value must be set as explained.\",\"Result\":\"Warning\",\"ActualValue\":\"120\",\"RequiredValue\":\"ClientAliveInterval 180\"},{\"TestID\":\"49\",\"TestCaseName\":\"OS Architecture\",\"Description\":\"Only 64-bit operating system should be supported.\",\"Result\":\"Passed\",\"ActualValue\":\"x86_64\\n\",\"RequiredValue\":\"x86_64,amd64\"},{\"TestID\":\"50\",\"TestCaseName\":\"Security threats\",\"Description\":\"Identifies OS with recent high profile vulnerability that might need patching.  Ignore warning if system was patched as appropriate.\",\"Result\":\"Passed\",\"ActualValue\":\"Ubuntu 18.04\",\"RequiredValue\":\"OS impacted by GHOSTS\"},{\"TestID\":\"51\",\"TestCaseName\":\"Auto Update\",\"Description\":\"Identifies if Linux Agent Auto Update is enabled or not.\",\"Result\":\"Passed\",\"ActualValue\":\"# AutoUpdate.Enabled=y\\n\",\"RequiredValue\":\"Yes\"},{\"TestID\":\"52\",\"TestCaseName\":\"SACK Vulnerability patch verification\",\"Description\":\"Checks if the running Kernel Version has SACK vulnerability patch.\",\"Result\":\"Passed\",\"ActualValue\":\"Ubuntu 18.04.5 LTS,Linux version 5.4.0-1023-azure (buildd@lgw01-amd64-053) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #23~18.04.1-Ubuntu SMP Thu Aug 20 14:46:48 UTC 2020\",\"RequiredValue\":\"Yes\"}]}"
    }
    

Étapes suivantes