共用方式為


教學課程 - 如何使用 cloud-init 在首次開機時於 Azure 中自訂 Linux 虛擬機器

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

在先前的教學課程中,您學到了如何以 SSH 連線到虛擬機器 (VM) 並手動安裝 NGINX。 若要以快速且一致的方式建立 VM,您通常需要借助某種形式的自動化。 在初次開機時自訂 VM 的常見方法是使用 cloud-init (英文)。 在本教學課程中,您將了解如何:

  • 建立 Cloud-init 組態檔
  • 建立 VM 來使用 Cloud-init 檔案
  • 在建立 VM 之後,檢視執行中的 Node.js 應用程式
  • 使用 Key Vault 安全地儲存憑證
  • 使用 Cloud-init 來安全地自動部署 NGINX

如果您選擇在本機安裝和使用 CLI,本教學課程會要求您執行 Azure CLI 2.0.30 版或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

Cloud-Init 概觀

Cloud-init (英文) 是在 Linux VM 初次開機時,廣泛用來自訂它們的方法。 您可以使用 cloud-init 來安裝封裝和寫入檔案,或者設定使用者和安全性。 當 cloud-init 在初次開機程序期間執行時,不需要使用任何額外的步驟或必要的代理程式來套用您的組態。

Cloud-init 也適用於散發套件。 例如,您不使用 apt-get installyum install 來安裝套件。 您可以改為定義要安裝的套件清單。 Cloud-init 會針對您選取的散發套件自動使用原生的套件管理工具。

我們正在與合作夥伴合作,以期在他們提供給 Azure 的映像中包含和使用 cloud-init。 如需每個發佈的 cloud-init 支援詳細資訊,請參閱 Azure中 VM 的 cloud-init 支援

建立 Cloud-init 組態檔

若要查看作用中的 cloud-init,請建立 VM 來安裝 NGINX 並執行簡單 'Hello World' Node.js 應用程式。 下列 cloud-init 組態會安裝必要的套件、建立 Node.js 應用程式,然後初始化並啟動應用程式。

在 Bash 提示字元或 Cloud Shell 中,建立名為 cloud-init.txt 的檔案,並貼上下列組態。 例如,輸入 sensible-editor cloud-init.txt 可建立檔案,並查看可用的編輯器清單。 請確定已正確複製整個 cloud-init 檔案,特別是第一行:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    defer: true
    content: |
      server {
        listen 80;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
    path: /home/azureuser/myapp/index.js
    defer: true
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

如需 Cloud-init 組態選項的詳細資訊,請參閱 Cloud-init 組態範例 \(英文\)。

建立虛擬機器

建立 VM 之前,請先使用 az group create 來建立資源群組。 下列範例會建立資源群組。 在這些命令中,會附加隨機後綴至資源群組和 VM 名稱,以防止重複部署期間發生名稱衝突。

export RANDOM_SUFFIX=$(openssl rand -hex 3)
export RESOURCE_GROUP="myResourceGroupAutomate$RANDOM_SUFFIX"
export REGION="eastus2"
az group create --name $RESOURCE_GROUP --location $REGION

結果:

{
  "id": "/subscriptions/xxxxx-xxxxx-xxxxx-xxxxx/resourceGroups/myResourceGroupAutomatexxx",
  "location": "eastus",
  "managedBy": null,
  "name": "myResourceGroupAutomatexxx",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

現在,使用 az vm create 建立 VM。 使用 --custom-data 參數以傳入 cloud-init 組態檔。 如果您將檔案儲存於目前工作目錄之外的位置,請提供 cloud-init.txt 組態的完整路徑。 下列範例會建立 VM;請注意,VM 名稱也會附加隨機後綴。

export VM_NAME="myAutomatedVM$RANDOM_SUFFIX"
az vm create \
    --resource-group $RESOURCE_GROUP \
    --name $VM_NAME \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init.txt

結果:

{
  "fqdns": "",
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupAutomatexxx/providers/Microsoft.Compute/virtualMachines/myAutomatedVMxxx",
  "location": "eastus",
  "name": "myAutomatedVMxxx",
  "powerState": "VM running",
  "publicIpAddress": "x.x.x.x",
  "resourceGroup": "myResourceGroupAutomatexxx",
  "zones": ""
}

系統需要花幾分鐘的時間來建立 VM、安裝封裝和啟動應用程式。 在 Azure CLI 將您返回提示字元之後,背景工作會繼續執行。 可能需要再等候幾分鐘,才能存取應用程式。 建立 VM 之後,請注意 Azure CLI 所顯示的 publicIpAddress。 此位址是用來透過 Web 瀏覽器存取 Node.js 應用程式。

若要讓 Web 流量到達您的 VM,請使用 az vm open-port 從網際網路開啟通訊埠 80:

az vm open-port --port 80 --resource-group $RESOURCE_GROUP --name $VM_NAME

結果:

{
  "endpoints": [
    {
      "name": "80",
      "protocol": "tcp",
      "publicPort": 80,
      "privatePort": 80
    }
  ],
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupAutomatexxx/providers/Microsoft.Compute/virtualMachines/myAutomatedVMxxx",
  "location": "eastus",
  "name": "myAutomatedVMxxx"
}

測試 Web 應用程式

現在您可以開啟網頁瀏覽器,並在網址列中輸入公用IP位址。 提供您自己從 VM 建立程序中取得的公用 IP 位址。 您的 Node.js 應用程式即會顯示,如下列範例所示:

顯示執行中 NGINX 網站的螢幕快照。

下一步

在本教學課程中,您已在初次開機時使用 Cloud-init 來設定 VM。 您已了解如何︰

  • 建立 Cloud-init 組態檔
  • 建立 VM 來使用 Cloud-init 檔案
  • 在建立 VM 之後,檢視執行中的 Node.js 應用程式
  • 使用 Key Vault 安全地儲存憑證
  • 使用 Cloud-init 來安全地自動部署 NGINX

前進至下一個教學課程,以了解如何建立自訂的 VM 映像。