Azure 虛擬機器上的自訂資料和 cloud-init

警告

本文參考 CentOS,這是接近結束生命週期 (EOL) 狀態的 Linux 發行版本。 請據以考慮您的使用和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指引

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

在 Microsoft Azure 虛擬機器 (VM) 佈建時,您可能需要插入指令碼或其他中繼資料。 在其他雲端,此概念通常稱為「使用者資料」。 Microsoft Azure 有類似的特色,稱為「自訂資料」

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

將自訂資料傳遞至 VM

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

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

az vm create \
  --resource-group myResourceGroup \
  --name centos74 \
  --image OpenLogic:CentOS-CI:7-CI:latest \
  --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

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 支援

常見問題集

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

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

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

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

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

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

Azure Instance Metadata Service (IMDS) 中無法使用自訂資料。 建議在 IMDS 中改用使用者資料。 如需詳細資訊,請參閱 Azure Instance Metadata Service 中的使用者資料