Freigeben über


Tutorial: Verwenden von cloud-init zum Anpassen eines virtuellen Linux-Computers in Azure beim ersten Start

Gilt für: ✔️ Linux-VMs ✔️ Flexible Skalierungsgruppen

In einem früheren Tutorial haben Sie erfahren, wie eine SSH-Verbindung mit einem virtuellen Computer hergestellt und NGINX manuell installiert wird. Um VMs auf schnelle und einheitliche Weise zu erstellen, ist meist eine Form der Automatisierung erwünscht. Eine gängige Methode zum Anpassen virtueller Computer beim ersten Start ist die Verwendung von cloud-Init. In diesem Tutorial lernen Sie Folgendes:

  • Erstellen einer cloud-init-Konfigurationsdatei
  • Erstellen eines virtuellen Computers, der eine cloud-init-Datei verwendet
  • Anzeigen einer laufenden Node.js-App nach dem Erstellen der VM
  • Verwenden von Key Vault zum sicheren Speichern der Zertifikate
  • Automatisieren der sicheren Bereitstellung von NGINX mithilfe von cloud-init

Wenn Sie die CLI lokal installieren und verwenden möchten, müssen Sie für dieses Tutorial die Azure CLI-Version 2.0.30 oder höher ausführen. Führen Sie az --version aus, um die Version zu ermitteln. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sei bei Bedarf unter Installieren der Azure CLI.

Übersicht zu cloud-init

Cloud-init ist ein weit verbreiteter Ansatz zum Anpassen einer Linux-VM beim ersten Start. Sie können mit cloud-init Pakete installieren und Dateien schreiben oder Benutzer und Sicherheit konfigurieren. Da cloud-init während des ersten Startvorgangs ausgeführt wird, müssen Sie keine zusätzlichen Schritte oder erforderlichen Agents auf Ihre Konfiguration anwenden.

Cloud-init funktioniert auch Distributionen übergreifend. Verwenden Sie z.B. nicht apt-get install oder yum install, um ein Paket zu installieren. Stattdessen können Sie eine Liste mit zu installierenden Paketen definieren. „cloud-init“ verwendet automatisch das native Paketverwaltungstool für die ausgewählte Distribution.

Wir arbeiten mit unseren Partnern zusammen, damit cloud-init einbezogen wird und in den Images arbeitet, die sie in Azure bereitstellen. Ausführliche Informationen zu cloud-init-Unterstützung für jede Distribution finden Sie unter cloud-init-Unterstützung für virtuelle Computer in Azure.

Erstellen der Konfigurationsdatei „cloud-init.txt“

Um cloud-init in Aktion zu sehen, erstellen Sie einen virtuellen Computer, der NGINX installiert und eine einfache „Hello World“-Node.js-App ausführt. Die folgende Cloud-Init-Konfiguration installiert die erforderlichen Pakete, erstellt eine Node.js App, initialisiert und startet die App.

Erstellen Sie an der Bash-Eingabeaufforderung oder in der Cloud Shell eine Datei namens cloud-init.txt, und fügen Sie die folgende Konfiguration ein. Geben Sie beispielsweise sensible-editor cloud-init.txt ein, um die Datei zu erstellen und eine Liste mit verfügbaren Editoren anzuzeigen. Stellen Sie sicher, dass die gesamte Datei „cloud-init“ ordnungsgemäß kopiert wird, insbesondere die erste Zeile:

#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

Weitere Informationen zu den cloud-init-Konfigurationsoptionen finden Sie in den cloud-init-Konfigurationsbeispielen.

Erstellen eines virtuellen Computers

Vor der Erstellung eines virtuellen Computers müssen Sie zunächst mit az group create eine Ressourcengruppe erstellen. Im folgenden Beispiel wird eine Ressourcengruppe erstellt. In diesen Befehlen wird ein zufälliges Suffix an die Ressourcengruppe und VM-Namen angefügt, um Namenskonflikte während wiederholter Bereitstellungen zu verhindern.

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

Ergebnisse:

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

Jetzt können Sie mit az vm create einen virtuellen Computer erstellen. Verwenden Sie den --custom-data-Parameter, um Ihre cloud-init-Konfigurationsdatei zu übergeben. Geben Sie den vollständigen Pfad zu der Konfigurationsdatei cloud-init.txt an, wenn Sie die Datei außerhalb Ihres vorhandenen Arbeitsverzeichnisses gespeichert haben. Im folgenden Beispiel wird ein virtueller Computer erstellt. Beachten Sie, dass der VM-Name auch mit dem zufälligen Suffix angefügt wird.

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

Ergebnisse:

{
  "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": ""
}

Es dauert einige Minuten, den virtuellen Computer zu erstellen, die Pakete zu installieren und die App zu starten. Es gibt Hintergrundaufgaben, die weiterhin ausgeführt werden, wenn Ihnen von der Azure CLI wieder eine Eingabeaufforderung angezeigt wird. Unter Umständen dauert es noch einige Minuten, bis Sie auf die App zugreifen können. Sobald der virtuelle Computer erstellt ist, notieren Sie die publicIpAddress, die von der Azure-CLI angezeigt wird. Diese Adresse wird verwendet, um über einen Webbrowser auf die Node.js-App zuzugreifen.

Damit Webdatenverkehr Ihren virtuellen Computer erreicht, öffnen Sie Port 80 über das Internet mit az vm open-port:

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

Ergebnisse:

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

Testen der Web-App

Jetzt können Sie einen Webbrowser öffnen und die öffentliche IP-Adresse in die Adressleiste eingeben. Geben Sie Ihre eigene öffentliche IP-Adresse aus dem Erstellungsprozess des virtuellen Computers an. Ihre Node.js-App wird wie im folgenden Beispiel angezeigt:

Screenshot der ausgeführten NGINX-Website.

Nächste Schritte

In diesem Tutorial haben Sie virtuelle Computer beim ersten Start mit cloud-init konfiguriert. Sie haben Folgendes gelernt:

  • Erstellen einer cloud-init-Konfigurationsdatei
  • Erstellen eines virtuellen Computers, der eine cloud-init-Datei verwendet
  • Anzeigen einer laufenden Node.js-App nach dem Erstellen der VM
  • Verwenden von Key Vault zum sicheren Speichern der Zertifikate
  • Automatisieren der sicheren Bereitstellung von NGINX mithilfe von cloud-init

Im nächsten Tutorial erfahren Sie, wie Sie benutzerdefinierte VM-Images erstellen.