適用於:✔️ 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 install 或 yum 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 應用程式即會顯示,如下列範例所示:
下一步
在本教學課程中,您已在初次開機時使用 Cloud-init 來設定 VM。 您已了解如何︰
- 建立 Cloud-init 組態檔
- 建立 VM 來使用 Cloud-init 檔案
- 在建立 VM 之後,檢視執行中的 Node.js 應用程式
- 使用 Key Vault 安全地儲存憑證
- 使用 Cloud-init 來安全地自動部署 NGINX
前進至下一個教學課程,以了解如何建立自訂的 VM 映像。