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

警告

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

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

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

VM 佈建是 Azure 向下傳遞您的 VM Creater 參數值 (例如主機名稱、使用者名稱,以及密碼),並在 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 22.04 UbuntuServer 22.04-LTS latest
Canonical 20.04 UbuntuServer 20.04-LTS latest
Canonical 18.04 UbuntuServer 18.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。

CentOS

發行者 / 版本 供應項目 SKU 版本 映像 cloud-init 就緒 Azure 上的 cloud-init 套件支援
OpenLogic 7 CentOS 7.7、7.8、7.9 latest
OpenLogic 8 CentOS 8.1、8.2、8.3 latest
  • 從 CentOS 7 (7.7 版) 和 CentOS 8 (8.1 版) 開始的所有其他 CentOS SKU (包括 Gen1 和 Gen2 映像),都是使用 cloud-init 佈建的。 CentOS 6.10、7.4、7.5 和 7.6 映像不支援 cloud-init。

注意

OpenLogic 現為 Rogue Wave Software

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
  • 從 SLES 15 (sp1) 和 SLES 12 (sp5) 開始的所有其他 SUSE SKU (包括 Gen1 和 Gen2 映像),都是使用 cloud-init 佈建的。
  • 此外,下列映像也是使用 cloud-init 佈建的 -
發行者 / 版本 供應項目 SKU / 版本
SUSE 12 SLES (SUSE Linux Enterprise Server) sles-{byos/sap/sap-byos}:12-sp4:2020.06.10
SUSE 12 SLES (SUSE Linux Enterprise Server) sles-{byos/sap/sap-byos}:12-sp3:2020.06.10
SUSE 12 SLES (SUSE Linux Enterprise Server) sles-{byos/sap/sap-byos}:12-sp2:2020.06.10
SUSE 15 SLES (SUSE Linux Enterprise Server) manager-proxy-4-byosgen1:2020.06.10
SUSE 15 SLES (SUSE Linux Enterprise Server) manager-server-4-byos:gen1:2020.06.10

Debian

發行者 / 版本 供應項目 SKU 版本 映像 cloud-init 就緒 Azure 上的 cloud-init 套件支援
debian (Gen1) debian-10 10-cloudinit 10:0.20201013.422 是 - 從下列套件版本開始支援:20.2-2~deb10u1
debian (Gen2) debian-10 10-cloudinit-gen2 0.20201013.422 是 - 從下列套件版本開始支援:20.2-2~deb10u1

目前 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 編輯器。 建議首先選擇使用 nano 編輯器。 請確定已正確複製整個 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 設定來處理。

Ctrl + X 結束檔案、輸入 y 儲存檔案,然後按 Enter 鍵在結束時確認檔案名稱。

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

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

az vm create \
  --resource-group myResourceGroup \
  --name centos74 \
  --image OpenLogic:CentOS-CI:7-CI: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 範例,請參閱下列文件: