分享方式:


測試虛擬機映像

本文說明如何測試虛擬機 (VM) 映射,以確保它符合最新的 Azure Marketplace 發佈需求。

部署 Azure VM

若要從 Azure 計算資源庫部署 VM(先前稱為 共用映像庫) 映射:

  1. 開啟 Azure 計算資源庫映像版本。
  2. 選取 [ 建立 VM]。
  3. 提供虛擬機 名稱 ,然後選取 VM 大小
  4. 選取 [檢閱 + 建立]。 通過驗證之後,請選取 [ 建立]。

注意

若要從 vhd 檔案建立 VM,請遵循下列 指示,在將認證工具連線至 VM 映射 或使用 PowerShell 來取用自我測試 API

提交 VM 供應專案之前,請先完成下列步驟:

執行驗證

有兩種方式可以在已部署的映像上執行驗證。

使用 Azure 認證的認證測試工具

重要

若要執行認證測試工具,Windows 遠端管理服務必須在 Windows 上執行並設定。 這可讓您存取埠 5986。 如需詳細資訊,請參閱 Windows 遠端管理的安裝和設定。

下載並執行認證測試工具

適用於 Azure 認證的認證測試工具會在本機 Windows 電腦上執行,但會測試以 Azure 為基礎的 Windows 或 Linux VM。 它會認證您的使用者 VM 映像可以搭配 Microsoft Azure 使用,並已符合準備 VHD 的指引和需求。

  1. 下載並安裝 Azure 認證的最新認證測試工具。
  2. 開啟認證工具,然後選取 [ 啟動新測試]。
  3. 從 [測試資訊] 畫面中,輸入 測試回合的測試名稱
  4. 選取 VM 的平臺,即 Windows Server (允許 Windows 的埠 5986)或 Linux (允許 Linux 的埠 22)。 您的平台選擇會影響其餘選項。
  5. 如果您的 VM 使用此資料庫服務,請選取 [測試 Azure SQL 資料庫] 複選框。

將認證工具連線至 VM 映像

  1. 選取 SSH 驗證模式:密碼驗證或金鑰檔案驗證。

  2. 如果使用密碼型驗證,請輸入 VM DNS 名稱使用者名稱和密碼的值。 您也可以變更預設的 SSH 連接埠號碼。

    顯示 VM 測試資訊的選取範圍。

  3. 如果使用金鑰檔案型驗證,請輸入 VM DNS 名稱、使用者名稱和私鑰位置的值。 您也可以包含複雜密碼,或變更預設的 SSH 埠號碼。

  4. 輸入完整 VM DNS 名稱(例如,MyVMName.Cloudapp.net)。

  5. 輸入 [用戶名稱] 和 [密碼]。

    顯示 VM 使用者名稱和密碼的選取範圍。

  6. 選取 [下一步]。

執行認證測試

在認證工具中為您的 VM 映像指定參數值之後,請選取 [測試連線] 以建立 VM 的有效連線。 驗證連線之後,請選取 [下一步 ] 以啟動測試。 測試完成時,結果會顯示在數據表中。 [狀態] 資料行會顯示每個測試的 [通過/失敗/警告]。 如果任何測試失敗,您的映像就不會通過認證。 在此情況下,請檢閱需求和失敗訊息、進行建議的變更,然後再次執行測試。

自動化測試完成後,請在 [問卷] 畫面的兩個索引卷標上提供 VM 映射的其他資訊:[一般評定] 和 [核心自定義],然後選取 [下一步]。

最後一個畫面可讓您提供更多資訊,例如Linux VM映像的SSH存取資訊,以及尋找例外狀況時任何失敗評定的說明。

最後,選取 [產生報告] 以下載所執行測試案例的測試結果和記錄檔,以及問卷的解答。

注意

少數發行者在 VM 上安裝防火牆等軟體時需要鎖定的案例。 在此情況下,請在這裡下載 認證測試工具 ,並在合作夥伴中心 支援提交報告。

使用 PowerShell 取用自我測試 API

在 Linux OS 上

在 PowerShell 中呼叫 API:

  1. 產生存取令牌。
  2. 使用 Invoke-WebRequest 命令來呼叫 API。
  3. 方法是Post,內容類型為 JSON,如下列程式代碼範例和螢幕擷取所示。
  4. 以 JSON 格式指定主體參數。

下列命令會產生存取權杖:

$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

顯示在PowerShell中產生存取令牌的螢幕範例。

此範例示範對 API 的 PowerShell 呼叫(在建立 VM 期間允許埠 22):

$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


以下是在 PowerShell 中呼叫 API 的範例:

在 PowerShell 中呼叫 API 的螢幕範例。


使用上述範例,您可以擷取 JSON 並加以剖析以取得下列詳細數據:

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


此範例畫面會顯示 $res.ContentJSON 格式的測試結果詳細資料:

在 PowerShell 中呼叫 API 的螢幕範例,其中包含測試結果的詳細數據。


以下是在線 JSON 查看器中檢視的 JSON 測試結果範例(例如 Code BeautifyJSON Viewer)。

在線 JSON 檢視器中的更多測試結果。

在 Windows OS 上

在 PowerShell 中呼叫 API:

  1. 使用 Invoke-WebRequest 命令來呼叫 API。
  2. 方法是Post,內容類型為 JSON,如下列程式代碼範例和範例畫面所示。
  3. 以 JSON 格式建立主體參數。

此程式代碼範例顯示對 API 的 PowerShell 呼叫(允許 VM 建立期間允許埠 5986):

$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

這些範例畫面會顯示在 PowerShell 中呼叫 API 的範例:

使用 SSH 金鑰

使用 SSH 金鑰在 PowerShell 中呼叫 API。

使用密碼

使用密碼在PowerShell中呼叫 API。


使用上述範例,您可以擷取 JSON 並加以剖析以取得下列詳細數據:

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


此畫面會顯示 $res.ContentJSON 格式的測試結果詳細資料:

JSON 格式測試結果的詳細數據。


以下是在線 JSON 查看器中檢視的測試結果範例(例如 Code BeautifyJSON Viewer)。

在線 JSON 檢視器中的測試結果。

使用 CURL 取用 Linux OS 上的自我測試 API

在此範例中,curl 將用來對Microsoft Entra ID 和自我主機 VM 進行 POST API 呼叫。

  1. 要求Microsoft Entra 令牌向自我主機 VM 進行驗證

    請確定 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'
    

    以下是來自要求的回應範例:

    {
        "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. 提交自我測試 VM 的要求

    請確定持有人令牌和參數會以正確的值取代。

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

    自我測試 VM API 呼叫的範例回應:

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