適用於:✔️ 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\SYSTEM 和 BUILTIN\Administrators 擁有完全控制權,CustomData.bin繼承這些權限。 如果你把 CustomData.bin 複製到其他地方處理,請明確設定目的地的權限,因為該檔案的權限不會隨檔案轉移。
Linux
在 Linux 作業系統上,自訂資料透過 ovf-env.xml 檔案傳遞至 VM。 該檔案於佈建期間複製到 /var/lib/waagent 目錄。 較新版的 Linux 代理程式會將 Base64 編碼的資料複製到 /var/lib/waagent/CustomData,以便您進行處理。
Azure 目前支援兩個佈建代理程式:
Linux 代理程式。 代理程式預設不處理自訂資料。 您需要建置已啟用資料功能的自訂映像。 相關設定如下:
Provisioning.DecodeCustomDataProvisioning.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 讀取使用者資料的詳細資訊,請參見 取得使用者資料。