分享方式:


Azure 中適用於虛擬機器的 Cloud-init 支援

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

此文章說明針對 cloud-init \(英文\) 存在的支援,以便在 Azure 中於佈建階段設定虛擬機器 (VM) 或虛擬機器擴展集。 一旦 Azure 佈建資源,這些 cloud-init 設定就會在初次開機時執行。

VM 佈建是 Azure 向下傳遞您的 VM Create 參數值 (例如主機名稱、使用者名稱,以及密碼),並在 VM 開機時為其加以提供的程序。 「佈建代理程式」將會使用那些值,設定 VM,然後在完成時回報。

Azure 支援兩種佈建代理程式,cloud-init \(英文\) 和 Azure Linux 代理程式 (WALA) \(部分機器翻譯\)。

cloud-init 概觀

cloud-init \(英文\) 時常用來對初次開機的 Linux VM 進行自訂。 您可以使用 cloud-init 來安裝封裝和寫入檔案,或者設定使用者和安全性。 因為在初次開機程序期間時會呼叫 Cloud-init,因此不需要使用任何額外的步驟或必要的代理程式,就可以套用您的設定。 如需如何正確地設定 #cloud-config 檔案或其他輸入之格式的詳細資訊,請參閱 cloud-init 文件網站 \(英文\)。 #cloud-config 檔案是以 base64 編碼的文字檔。

cloud-init 也可在不同的發行版本上運作。 例如,您不使用 apt-get installyum install 來安裝套件。 您可以改為定義要安裝的套件清單。 cloud-init 會針對您選取的發行版本,自動使用原生的套件管理工具。

我們一直積極地與背書的 Linux 發行版本合作夥伴合作,以便在 Azure Marketplace 中提供支援 Cloud-init 的映像。 這些映像會讓您的 Cloud-init 部署和設定順暢地與 VM 和虛擬機器擴展集運作。 一開始,我們會與經過背書的 Linux 發行版本合作夥伴及上游合作,以確保 cloud-init 能在 Azure 上與 OS 搭配運作,然後便會更新套件,並在發行版本套件存放庫中公開提供。

在 Azure 上於支援的 Linux 散發套件 OS 上提供 cloud-init 有兩個階段:套件支援,然後映像支援:

  • 「Azure 上的 cloud-init 套件支援」會記載接下來有哪些 cloud-init 套件會受到支援或處於預覽狀態,讓您可以在自訂映像中將這些套件與 OS 搭配使用。
  • 「映像 cloud-init 就緒」會記載映像是否已設定為可以使用 cloud-init。

Canonical

發行者 / 版本 供應項目 SKU 版本 映像 cloud-init 就緒 Azure 上的 cloud-init 套件支援
Canonical 24.04 UbuntuServer 22.04-LTS latest
Canonical 22.04 UbuntuServer 22.04-LTS latest
Canonical 20.04 UbuntuServer 20.04-LTS latest

RHEL

發行者 / 版本 供應項目 SKU 版本 映像 cloud-init 就緒 Azure 上的 cloud-init 套件支援
RedHat 7 RHEL 7.7、7.8、7_9 latest
RedHat 8 RHEL 8.1、8.2、8_3、8_4 latest
RedHat 9 RHEL 9_0, 9_1 latest
  • 從 RHEL 7 (7.7 版) 和 RHEL 8 (8.1 版) 開始的所有其他 RedHat SKU (包括 Gen1 和 Gen2 映像),都是使用 cloud-init 佈建的。 RHEL 6 不支援 Cloud-init。

Oracle

發行者 / 版本 供應項目 SKU 版本 映像 cloud-init 就緒 Azure 上的 cloud-init 套件支援
Oracle 7 Oracle Linux 77、78、ol79 latest
Oracle 8 Oracle Linux 81、ol82、ol83-lvm、ol84-lvm latest
  • 從 Oracle 7 (7.7 版) 和 Oracle 8 (8.1 版) 開始的所有其他 Oracle SKU (包括 Gen1 和 Gen2 映像),都是使用 cloud-init 佈建的。

SUSE SLES

發行者 / 版本 供應項目 SKU 版本 映像 cloud-init 就緒 Azure 上的 cloud-init 套件支援
SUSE 15 SLES (SUSE Linux Enterprise Server) sp1、sp2、sp3 latest
SUSE 12 SLES (SUSE Linux Enterprise Server) sp5 latest

Debian

發行者 / 版本 供應項目 SKU 版本 映像 cloud-init 就緒 Azure 上的 cloud-init 套件支援
debian-10 Debian 10-cloudinit-gen2 Debian:debian-10:10-cloudinit-gen2:0.0.1015
debian-10 Debian 10-cloudinit-gen2 Debian:debian-10:10-cloudinit-gen2:0.0.991
debian-10 Debian 10-cloudinit-gen2 Debian:debian-10:10-cloudinit-gen2:0.0.999

目前,Azure Stack 支援已啟用 cloud-init 之映像的佈建。

cloud-init 和 Linux 代理程式 (WALA) 之間有哪些差異?

WALA 是 Azure 平台專屬的代理程式,用於佈建及設定 VM,以及處理 Azure 延伸模組 \(部分機器翻譯\)。

我們正在加強設定 VM 以使用 cloud-init 取代 Linux 代理程式的工作,以讓現有的 cloud-init 客戶使用其目前的 cloud-init 指令碼,或是讓新客戶利用豐富的 cloud-init 設定功能。 如果您已經對用於設定 Linux 系統所的 cloud-init 指令碼有所投入,則您不需要其他任何設定就可以讓 cloud-init 加以處理。

cloud-init 無法處理 Azure 延伸模組,因此在映像中仍然需要 WALA 來處理延伸模組,但需要停用其佈建程式碼。 對於由 cloud-init 轉換為佈建之經過背書的 Linux 散發版本映像,它們已安裝 WALA 並正確設定。

建立 VM 時,如果您在佈建階段未包含 Azure CLI --custom-data 參數,cloud-init 或 WALA 會採用所需的最低限度 VM 佈建參數來佈建 VM,並使用預設值完成部署。 如果您使用 --custom-data 參數來參考 cloud-init 設定,您自訂資料中所包含的所有內容都會在 VM 開機時提供給 cloud-init 使用。

套用到 VM 的 cloud-init 設定沒有時間限制,且不會因逾時而導致部署失敗。WALA 並非如此,如果您變更 WALA 預設值以處理自訂資料,其不能超過 40 分鐘的總 VM 佈建時間額度;如果超過,VM Create 將會失敗。

不使用 UDF 驅動程式的 cloud-init VM 佈建

從 cloud-init 21.2 開始,您可以直接使用 cloud-init 在 Azure 中佈建 VM,而無需 UDF 驅動程式。 如果映像中未提供 UDF 驅動程式,cloud-init 會使用 Azure 執行個體中繼資料服務中提供的中繼資料來佈建 VM。 此選項僅適用於 SSH 金鑰和使用者資料。 若要在佈建期間將密碼或自訂資料傳入 VM,則必須使用 UDF 驅動程式。

部署支援 cloud-init 的虛擬機器

部署支援 cloud-init 的虛擬機器就像在部署期間參考支援 cloud-init 的發行版本一樣簡單。 Linux 發行版本維護者必須選擇啟用,並將 cloud-init 整合到其基礎 Azure 發行映像。 一旦您確認您想要部署的映像支援 cloud-init,您就可以使用 Azure CLI 來部署映像。

部署此映像的第一個步驟是使用 az group create 命令建立資源群組。 Azure 資源群組是在其中部署與管理 Azure 資源的邏輯容器。

下列範例會在 eastus 位置建立名為 myResourceGroup 的資源群組。

az group create --name myResourceGroup --location eastus

下一個步驟是在您目前的殼層中建立名為 cloud-init.txt 的檔案,並貼上下列設定。 針對此案例,在 Cloud Shell 中 (而不是本機電腦上) 建立該檔案。 您可以使用您選擇的任何編輯器。 輸入 sensible-editor cloud-init.txt 以建立檔案並查看可用編輯器的清單。 使用您選擇的編輯器。 一些典型的選擇是 nanovimed。 請確定已正確複製整個 cloud-init 檔案,特別是第一行:

SLES Ubuntu RHEL
# cloud-config
package_upgrade: true
packages:
- apache2
# cloud-config
package_upgrade: true
packages:
- httpd
# cloud-config
package_upgrade: true
packages:
- httpd

注意

cloud-init 有多個輸入類型,cloud-init 會使用 customData/userData 的第一行指出應如何處理輸入,例如,#cloud-config 表示應將內容視為 cloud-init 設定來處理。

結束該檔案,並根據編輯器儲存該檔案。 結束時驗證檔案名稱。

最後一個步驟是使用 az vm create 命令來建立 VM。

下列範例會建立名為 ubuntu2204 的 VM,並建立 SSH 金鑰 (如果它們不存在於預設金鑰位置)。 若要使用一組特定金鑰,請使用 --ssh-key-value 選項。 使用 --custom-data 參數以傳入 cloud-init 組態檔。 如果您將檔案儲存於目前工作目錄之外的位置,請提供 cloud-init.txt 組態的完整路徑。

az vm create \
  --resource-group myResourceGroup \
  --name ubuntu2204 \
  --image Canonical:UbuntuServer:22_04-lts:latest \
  --custom-data cloud-init.txt \
  --generate-ssh-keys 

建立 VM 後,Azure CLI 會顯示您的部署的特定資訊。 記下 publicIpAddress。 此位址用來存取 VM。 系統需要花一些時間建立 VM、安裝套件以及啟動應用程式。 在 Azure CLI 將您返回提示字元之後,背景工作會繼續執行。 您可以透過 SSH 連線到 VM,並使用「疑難排解」一節中所述的步驟來檢視 cloud-init 記錄。

您也可以在 ARM 範本中傳入參數,以部署已啟用 cloud-init 的 VM。

針對 cloud-init 進行疑難排解

佈建 VM 後,cloud-init 會執行 --custom-data 中定義的所有模組和指令碼,以設定 VM。 如果您需要針對設定中的任何錯誤或遺漏進行疑難排解,則需要在 cloud-init 記錄 (位於 /var/log/cloud-init.log) 中搜尋模組名稱 (例如 disk_setupruncmd)。

注意

並非每個模組失敗都會導致嚴重的 cloud-init 整體設定失敗。 例如,使用 runcmd 模組時,如果指令碼失敗,cloud-init 會因為執行了 runcmd 模組而仍然報告佈建成功,。

如需 cloud-init 記錄的詳細資訊,請參閱 cloud-init 文件

遙測

cloud-init 會收集使用方式資料並傳送給 Microsoft,協助改善我們的產品和服務。 遙測只會在佈建程序 (第一次開機 VM) 期間收集。 收集的資料可協助我們調查佈建失敗原因,並監視效能和可靠性。 收集的資料不包含任何識別碼 (個人識別碼)。 若要深入了解,請閱讀我們的隱私權聲明。 收集的一些遙測範例 (這並非詳盡清單):OS 相關資訊 (cloud-init 版本、散發版本、核心版本)、基本 VM 佈建動作的效能計量 (取得 DHCP 租用的時間、擷取設定 VM 所需的中繼資料等)、cloud-init 記錄檔和 dmesg 記錄檔。

目前已針對大部分使用 cloud-init 的市集映像啟用遙測收集。 其啟用方式是指定 cloud-init 的 KVP 遙測報告程式。 在大部分的 Azure Marketplace 映像中,您可以在檔案 /etc/cloud/cloud.cfg.d/10-azure-kvp.cfg 中找到此設定。 若在映像準備期間移除此檔案,則會針對從此映像建立的任何 VM 停用遙測收集。

10-azure-kvp.cfg 的範例內容

reporting:
  logging:
    type: log
  telemetry:
    type: hyperv

下一步

對 cloud-init 的問題進行疑難排解

如需設定變更的 cloud-init 範例,請參閱下列文件: