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 install 或 yum 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 以建立檔案並查看可用編輯器的清單。 使用您選擇的編輯器。 一些典型的選擇是 nano、vim 或 ed。 請確定已正確複製整個 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_setup
或 runcmd
)。
注意
並非每個模組失敗都會導致嚴重的 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 範例,請參閱下列文件: