Azure 虛擬機器上的自訂資料

適用於:✔️ Linux VM ✔️ Windows VM ✔️ 彈性擴展集

在 Microsoft Azure 虛擬機器 (VM) 佈建時,您可能需要插入指令碼或其他中繼資料。 Azure 透過一個叫做自訂資料的功能支援這種情況。

自訂資料於 VM 最初啟動或設定期間提供給 VM,這稱為「佈建」。 佈建是指提供 VM 建立參數 (例如主機名稱、使用者名稱、密碼、憑證、自訂資料和金鑰) 給 VM 的過程。 像 cloud-init 這類配置代理會處理這些參數。

Note

Azure 也提供獨立的使用者資料功能。 與自訂資料不同,使用者資料可從 Azure 實例中繼資料服務(IMDS)取得,且在虛擬機生命週期內持續存在,且可在不停止或重映像虛擬機的情況下更新。 當您需要佈建後存取或更新時,請使用使用者資料;當您需要在首次開機時由佈建代理程式處理的酬載時,請使用自訂資料。

將自訂資料傳遞至 VM

若要使用自訂資料,除非您使用 CLI 工具替您轉換,例如 AZ CLI,否則必須先將內容進行 Base64 編碼,再將資料傳遞至 API。 大小不能超過 64 KB。

在 CLI 中,您可以將自訂資料當作檔案傳遞,如下列範例所示。 檔案會轉換成 Base64。

az vm create \
  --resource-group myResourceGroup \
  --name myVM \
  --image Ubuntu2204 \
  --custom-data cloud-init.txt \
  --generate-ssh-keys

Azure Resource Manager 中有 base64 函式

"name": "[parameters('virtualMachineName')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2019-07-01",
"location": "[parameters('location')]",
"dependsOn": [
..],
"variables": {
        "customDataBase64": "[base64(parameters('stringData'))]"
    },
"properties": {
..
    "osProfile": {
        "computerName": "[parameters('virtualMachineName')]",
        "adminUsername": "[parameters('adminUsername')]",
        "adminPassword": "[parameters('adminPassword')]",
        "customData": "[variables('customDataBase64')]"
        },

處理自訂資料

安裝在 VM 上的佈建代理程式負責與平台通訊,並將資料放在檔案系統上。

Windows

自訂資料會以二進位檔的形式放在 %SystemDrive%\AzureData\CustomData.bin ,但不會被處理。 要處理這個檔案,請建立自訂映像檔並撰寫讀取 CustomData.bin的程式碼。

%SystemDrive%\AzureData 資料夾在配置期間會被保護,只有 NT AUTHORITY\SYSTEMBUILTIN\Administrators 擁有完全控制權,CustomData.bin繼承這些權限。 如果你把 CustomData.bin 複製到其他地方處理,請明確設定目的地的權限,因為該檔案的權限不會隨檔案轉移。

Linux

在 Linux 作業系統上,自訂資料透過 ovf-env.xml 檔案傳遞至 VM。 該檔案於佈建期間複製到 /var/lib/waagent 目錄。 較新版的 Linux 代理程式會將 Base64 編碼的資料複製到 /var/lib/waagent/CustomData,以便您進行處理。

Azure 目前支援兩個佈建代理程式:

  • Linux 代理程式。 代理程式預設不處理自訂資料。 您需要建置已啟用資料功能的自訂映像。 相關設定如下:

    • Provisioning.DecodeCustomData
    • Provisioning.ExecuteCustomData

    啟用自訂資料並執行指令碼時,在指令碼執行完畢前,虛擬機器都不會回報成功的 VM 佈建。 如果指令碼超過 VM 佈建時間限制總計 40 分鐘,VM 建立會失敗。

    如果指令碼無法執行,或在執行期間發生錯誤,則不算是嚴重的佈建失敗。 您必須建立通知路徑,以獲知指令碼的完成狀態。

    若要針對自訂資料執行進行疑難排解,請檢閱 /var/log/waagent.log

  • cloud-init。 此代理程式預設會處理自訂資料。 接受多種格式的自訂資料,例如 cloud-init 設定和指令碼。

    類似於 Linux 代理程式,當 cloud-init 處理自訂資料時,如果在設定處理或指令碼執行期間發生錯誤,則不算是嚴重的佈建失敗。 您必須建立通知路徑,以獲知指令碼的完成狀態。

    但不同於 Linux 代理程式,cloud-init 不會等待使用者的自訂資料設定完成,才向平台回報 VM 已就緒。 如需 Azure 上的 cloud-init 的詳細資訊,包括疑難排解,請參閱 Azure 中對於虛擬機器的 cloud-init 支援

FAQ

我可以在建立 VM 後更新自訂資料嗎?

對於單一 VM,您無法在 VM 模型中更新自訂資料。 但對於虛擬機器擴展集,您可以更新自訂資料。 如需詳細資訊,請參閱修改擴展集。 當您在模型中更新虛擬機器擴展集的自訂資料時:

  • 擴展集中的現有執行個體必須更新至最新模型並重新映像,才能取得更新後的自訂資料。
  • 新執行個體會收到新的自訂資料。

我可以將機密值放置在自訂資料中嗎?

建議您不要將敏感性資料儲存在自訂資料中。 如需詳細資訊,請參閱 Azure 資料安全性和加密最佳做法

在 IMDS 中是否提供自訂資料功能?

No. 自訂資料不會透過 Azure 實例元資料服務(IMDS)呈現。 如果你需要在配置後從虛擬機內部取得有效載荷,或是在不停止或重映像虛擬機的情況下更新,請改用 使用者資料 功能。 關於如何從 IMDS 讀取使用者資料的詳細資訊,請參見 取得使用者資料