Testare un'immagine di macchina virtuale

Questo articolo descrive come testare un'immagine di macchina virtuale (VM) per assicurarsi che soddisfi i requisiti di pubblicazione più recenti di Azure Marketplace.

Distribuire una macchina virtuale di Azure

Per distribuire una macchina virtuale dalla raccolta di calcolo di Azure (in precedenza nota come Raccolta immagini condivise) immagine:

  1. Aprire la versione dell'immagine della raccolta di calcolo di Azure.
  2. Selezionare Crea macchina virtuale.
  3. Specificare un nome macchina virtuale e selezionare le dimensioni di una macchina virtuale.
  4. Selezionare Rivedi e crea. Dopo aver superato la convalida, selezionare Crea.

Nota

Per creare una macchina virtuale da un file vhd, seguire le istruzioni riportate di seguito in Connessione lo strumento di certificazione a un'immagine di macchina virtuale o Usare PowerShell per usare l'API self-test.

Prima di inviare l'offerta di macchina virtuale, completare questi passaggi:

Eseguire convalide

Esistono due modi per eseguire le convalide nell'immagine distribuita.

Usare lo strumento di test della certificazione per Azure Certified

Importante

Per eseguire lo strumento di test di certificazione, il servizio Gestione remota Windows deve essere in esecuzione e configurato in Windows. In questo modo è possibile accedere alla porta 5986. Per informazioni, vedere Installazione e configurazione per Gestione remota Windows.

Scaricare ed eseguire lo strumento di test di certificazione

Lo strumento di test di certificazione per Azure Certified viene eseguito in un computer Windows locale, ma esegue il test di una macchina virtuale Linux o Windows basata su Azure. Lo strumento verifica che l'immagine di macchina virtuale dell'utente possa essere usata con Microsoft Azure e che siano stati soddisfatti i requisiti e le linee guida per la preparazione del disco rigido virtuale.

  1. Scaricare e installare lo strumento di test di certificazione per Azure Certified.
  2. Aprire lo strumento di certificazione, quindi selezionare Avvia nuovo test.
  3. Nella schermata Informazioni test immettere un nome test per l'esecuzione del test.
  4. Selezionare la piattaforma per la macchina virtuale, Ovvero Windows Server (consentire la porta 5986 per Windows) o Linux (consentire la porta 22 per Linux). La piattaforma scelta determina le opzioni rimanenti.
  5. Se la macchina virtuale usa questo servizio di database, selezionare la casella di controllo Test for Azure SQL Database (Test per il database SQL di Azure).

Connettere lo strumento di certificazione a un'immagine di macchina virtuale

  1. Selezionare la modalità di autenticazione SSH: Autenticazione password o Autenticazione del file di chiave.

  2. Se si usa l'autenticazione basata su password, immettere i valori per il nome DNS della macchina virtuale, il nome utente e la password. Facoltativamente, è possibile modificare il valore predefinito per la Porta SSH.

    Shows the selection of VM test information.

  3. Se si usa l'autenticazione basata su file di chiavi, immettere i valori nei campi VM DNS Name (Nome DNS macchina virtuale), User name (Nome utente) e Private key (Chiave privata). È anche possibile specificare un valore per Passphrase o modificare il numero predefinito per il campo Porta SSH.

  4. Immettere il nome DNS completo della macchina virtuale, ad esempio MyVMName.Cloudapp.net.

  5. Immettere Nome utente e Password.

    Shows the selection of VM user name and password.

  6. Seleziona Avanti.

Eseguire un test di certificazione

Dopo aver assegnato i valori dei parametri per l'immagine della macchina virtuale nello strumento di certificazione, selezionare Test Connessione ion per creare una connessione valida alla macchina virtuale. Dopo che la connessone è verificata, selezionare Next (Avanti) per avviare il test. Al termine del test, i risultati vengono visualizzati in una tabella. La colonna Stato mostra (Pass/Fail/Warning) per ogni test. Se uno dei test ha esito negativo, l'immagine non è certificata. In questo caso, esaminare i requisiti e i messaggi di errore, apportare le modifiche indicate ed eseguire nuovamente il test.

Al termine del test automatizzato, fornire informazioni aggiuntive sull'immagine della macchina virtuale nelle due schede della schermata Questionario, Valutazione generale e Personalizzazione kernel, quindi selezionare Avanti.

L'ultima schermata consente di fornire altre informazioni, ad esempio informazioni sull'accesso SSH per un'immagine di macchina virtuale Linux, e una spiegazione per eventuali valutazioni non riuscite se si cercano eccezioni.

Selezionare infine Genera report per scaricare i risultati del test e i file di log per i casi di test eseguiti, oltre alle risposte al questionario.

Nota

Alcuni editori hanno scenari in cui le macchine virtuali devono essere bloccate perché dispongono di software, ad esempio firewall installati nella macchina virtuale. In questo caso, scaricare lo strumento di test certificato qui e inviare il report al supporto del Centro per i partner.

Uso di PowerShell per usare l'API self-test

Nel sistema operativo Linux

Chiamare l'API in PowerShell:

  1. Generare il token di accesso.
  2. Usare il comando Invoke-WebRequest per chiamare l'API.
  3. Il metodo è POST e il tipo di contenuto è JSON, come illustrato nella schermata e nell'esempio di codice seguenti.
  4. Specificare i parametri del corpo in formato JSON.

I comandi seguenti generano un token di accesso:

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

Questo esempio mostra una chiamata di PowerShell all'API (consentire la porta 22 durante la creazione della macchina virtuale):

$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


Ecco un esempio di chiamata dell'API in PowerShell:

Screen example for calling the API in PowerShell.


Usando l'esempio precedente, è possibile recuperare il file JSON e analizzarlo in modo da ottenere i dettagli seguenti:

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


Questa schermata di esempio, che mostra $res.Content, mostra i dettagli dei risultati del test in formato JSON:

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


Di seguito è riportato un esempio di risultati dei test JSON visualizzati in un visualizzatore JSON online, ad esempio Code Beautify o JSON Viewer.

More test results in an online JSON viewer.

Nel sistema operativo Windows

Chiamare l'API in PowerShell:

  1. Usare il comando Invoke-WebRequest per chiamare l'API.
  2. Il metodo è Post e il tipo di contenuto è JSON, come illustrato nell'esempio di codice e nella schermata di esempio seguente.
  3. Creare i parametri del corpo in formato JSON.

Questo esempio di codice mostra una chiamata di PowerShell all'API (consentire la porta 5986 durante la creazione della macchina virtuale):

$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

Queste schermate di esempio mostrano esempi per chiamare l'API in PowerShell:

Con la chiave SSH:

Calling the API in PowerShell with an SSH Key.

Con password:

Calling the API in PowerShell with a password.


Usando l'esempio precedente, è possibile recuperare il file JSON e analizzarlo in modo da ottenere i dettagli seguenti:

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


Questa schermata, che mostra $res.Content, mostra i dettagli dei risultati del test in formato JSON:

Details of test results in JSON format.


Di seguito è riportato un esempio di risultati dei test visualizzati in un visualizzatore JSON online, ad esempio Code Beautify o JSON Viewer.

Test results in an online JSON viewer.

Uso di CURL per usare l'API self-test nel sistema operativo Linux

In questo esempio curl verrà usato per effettuare una chiamata API POST all'ID Microsoft Entra e alla macchina virtuale self-host.

  1. Richiedere un token Microsoft Entra per l'autenticazione alla macchina virtuale self-host

    Verificare che i valori corretti vengano sostituiti nella richiesta 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'
    

    Di seguito è riportato un esempio della risposta dalla richiesta:

    {
        "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. Inviare una richiesta per la macchina virtuale self-test

    Verificare che il token di connessione e i parametri vengano sostituiti con i valori corretti.

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

    Risposta di esempio dalla chiamata api macchina virtuale self-test:

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

Passaggi successivi