Zelfstudie - Cloud-init gebruiken voor het aanpassen van een virtuele Linux-machine in Azure bij de eerste keer dat die wordt opgestart

Van toepassing op: ✔️ Flexibele schaalsets voor Linux-VM's ✔️

In een vorige zelfstudie hebt u geleerd hoe u een virtuele machine (VM) via SSH kunt verbinden en NGINX handmatig kunt installeren. Als u virtuele machines op een snelle en consistente manier wilt maken, is een vorm van automatisering doorgaans gewenst. Een veelgebruikte manier voor het aanpassen van een virtuele machine bij de eerste keer opstarten is het gebruik van cloud-init. In deze zelfstudie leert u het volgende:

  • Een cloud-init-configuratiebestand maken
  • Een virtuele machine maken die gebruikmaakt van een cloud-init-bestand
  • Een actieve Node.js-app weergeven nadat de virtuele machine is gemaakt
  • Key Vault gebruiken voor het veilig opslaan van certificaten
  • Beveiligde implementaties van NGINX automatiseren met cloud-init

Als u ervoor kiest om de CLI lokaal te installeren en te gebruiken, moet u Azure CLI 2.0.30 of hoger gebruiken voor deze zelfstudie. Voer az --version uit om de versie te bekijken. Zie Azure CLI installeren als u de CLI wilt installeren of een upgrade wilt uitvoeren.

Overzicht van cloud-init

Cloud-init is een veelgebruikte benadering voor het aanpassen van een Linux-VM als deze voor de eerste keer wordt opgestart. U kunt cloud-init gebruiken voor het installeren van pakketten en schrijven van bestanden, of om gebruikers en beveiliging te configureren. Als de initialisatie van de cloud-init wordt uitgevoerd tijdens het opstartproces, zijn er geen extra stappen of agents vereist om uw configuratie toe te passen.

Cloud-init werkt ook in distributies. U gebruikt bijvoorbeeld niet apt-get install of yum install om een pakket te installeren. In plaats daarvan kunt u een lijst definiëren met te installeren pakketten. Cloud-init maakt automatisch gebruik van het hulpprogramma voor systeemeigen pakketbeheer voor de distro die u selecteert.

Samen met onze partners willen we cloud-init opnemen en werkend krijgen in de installatiekopieën die zij aan Azure leveren. Raadpleeg Cloud-init-ondersteuning voor virtuele machines in Azure voor gedetailleerde informatie over Cloud-init-ondersteuning voor elke distributie.

Een cloud-init-configuratiebestand maken

Als u cloud-init in actie wilt zien, maakt u een VM waarop NGINX is geïnstalleerd en een eenvoudige 'Hallo wereld' Node.js-app wordt uitgevoerd. Met de volgende cloud init-configuratie installeert u de vereiste pakketten, maakt u een Node.js-app en initialiseert en start u vervolgens de app.

Maak bij de Bash-prompt of in Cloud Shell een bestand met de naam cloud-init.txt en plak de volgende configuratie in het bestand. Typ bijvoorbeeld sensible-editor cloud-init.txt om het bestand te maken en om een overzicht van beschikbare editors te zien. Controleer of het hele cloud-init-bestand correct is gekopieerd, met name de eerste regel:

#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

Zie Voorbeelden van cloud-init-configuraties voor meer informatie over configuratieopties voor cloud-init.

Virtuele machine maken

Voordat u een virtuele machine kunt maken, moet u eerst een resourcegroep maken met az-groep maken. In het volgende voorbeeld wordt een resourcegroep met de naam myResourceGroupAutomate gemaakt op de locatie VS Oost:

az group create --name myResourceGroupAutomate --location eastus

Maak een virtuele machine met az vm create. Gebruik de --custom-data-parameter om door te geven in uw cloud-init-configuratiebestand. Geef het volledige pad naar cloud-init.txt op als u het bestand buiten uw huidige werkmap hebt opgeslagen. In het volgende voorbeeld wordt een VM met de naam myVM gemaakt:

az vm create \
    --resource-group myResourceGroupAutomate \
    --name myAutomatedVM \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init.txt

Het duurt enkele minuten voordat de virtuele machine wordt gemaakt, de pakketten worden geïnstalleerd en de app gestart. Er zijn achtergrondtaken die nog worden uitgevoerd nadat u door de Azure CLI bent teruggeleid naar de prompt. Het duurt mogelijk nog een paar minuten voordat u toegang hebt tot de app. Wanneer de virtuele machine is gemaakt, let op de publicIpAddress weergegeven door de Azure CLI. Dit adres wordt gebruikt voor toegang tot de Node.js-app in een webbrowser.

Open poort 80 via internet met az vm open-port zodat beveiligd webverkeer uw virtuele machine kan bereiken:

az vm open-port --port 80 --resource-group myResourceGroupAutomate --name myAutomatedVM

Web-app testen

U kunt nu een webbrowser openen en http://< publicIpAddress> invoeren in de adresbalk. Geef uw eigen openbare IP-adres op uit het creatieproces van de virtuele machine proces. De Node.js-app wordt weergegeven zoals in het volgende voorbeeld:

Actieve NGINX-site weergeven

Certificaten van Key Vault invoeren

In deze optionele sectie wordt beschreven hoe u certificaten veilig kunt opslaan in Azure Key Vault en ze tijdens de implementatie van de virtuele machine kunt invoeren. In plaats van een aangepaste installatiekopie te gebruiken die de certificaten standaard bevat, zorgt dit proces ervoor dat de meest recente certificaten zijn ingevoerd op een virtuele machine bij de eerste keer opstarten. Tijdens het proces verlaten de certificaten nooit het Azure-platform, en ook worden ze niet blootgesteld aan een script, opdrachtregelgeschiedenis of sjabloon.

Azure Key Vault beschermt cryptografische sleutels en geheimen, zoals certificaten of wachtwoorden. Key Vault stroomlijnt het beheerproces voor sleutels en zorgt dat u de controle houdt over de sleutels waarmee uw gegevens toegankelijk zijn en worden versleuteld. Dit scenario bevat enkele Key Vault-concepten voor het maken en gebruiken van een certificaat, maar biedt geen volledig overzicht van het gebruik van Key Vault.

De volgende stappen laten zien hoe u het volgende kunt doen:

  • Een Azure Key Vault maken
  • Een certificaat genereren of uploaden naar de Key Vault
  • Een geheim maken van het certificaat dat moet worden ingevoerd in een virtuele machine
  • Een virtuele machine maken en het certificaat invoeren

Een Azure Key Vault maken

Maak eerst een Key Vault met az keyvault create en schakel deze in voor gebruik wanneer u een virtuele machine implementeert. Elke Key Vault moet een unieke naam hebben van alleen kleine letters. Vervang mykeyvault in het volgende voorbeeld door de naam van uw eigen unieke Key Vault:

keyvault_name=mykeyvault
az keyvault create \
    --resource-group myResourceGroupAutomate \
    --name $keyvault_name \
    --enabled-for-deployment

Een certificaat genereren en opslaan in Key Vault

Voor gebruik in de productie, moet u een geldig certificaat importeren dat is ondertekend door een vertrouwde provider met az keyvault certificate import. Voor deze zelfstudie toont het volgende voorbeeld hoe kunt u een zelfondertekend certificaat kunt genereren met az keyvault certificate create dat gebruikmaakt van het standaardbeleid voor certificaten:

az keyvault certificate create \
    --vault-name $keyvault_name \
    --name mycert \
    --policy "$(az keyvault certificate get-default-policy --output json)"

Een certificaat voor gebruik met een virtuele machine voorbereiden

Om het certificaat te gebruiken tijdens het creatieproces van de virtuele machine, verkrijgen de ID van het certificaat met az keyvault secret list-versions. Voor de VM is vereist dat het certificaat een bepaalde indeling heeft om te kunnen worden ingevoerd bij het opstarten. Converteer het certificaat daarom met az vm format-secret. Het volgende voorbeeld wijst de uitvoer van deze opdrachten toe aan variabelen voor eenvoudig gebruik in de volgende stappen:

secret=$(az keyvault secret list-versions \
          --vault-name $keyvault_name \
          --name mycert \
          --query "[?attributes.enabled].id" --output tsv)
vm_secret=$(az vm secret format --secret "$secret" --output json)

Cloud-init-config maken om NGINX te beveiligen

Wanneer u een virtuele machine maakt, worden certificaten en sleutels opgeslagen in de beveiligde /var/lib/waagent/ directory. U kunt de bijgewerkte cloud-init-configuratie uit het vorige voorbeeld gebruiken om het certificaat toe te voegen en NGINX te configureren.

Maak een bestand met de naam cloud-init-secured.txt en plak de volgende configuratie. Als u Cloud Shell gebruikt, maakt u het cloud-init-configuratiebestand daar en niet op uw lokale computer. Typ bijvoorbeeld sensible-editor cloud-init-secured.txt om het bestand te maken en om een overzicht van beschikbare editors te zien. Controleer of het hele cloud-init-bestand correct is gekopieerd, met name de eerste regel:

#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;
        listen 443 ssl;
        ssl_certificate /etc/nginx/ssl/mycert.cert;
        ssl_certificate_key /etc/nginx/ssl/mycert.prv;
        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:
  - secretsname=$(find /var/lib/waagent/ -name "*.prv" | cut -c -57)
  - mkdir /etc/nginx/ssl
  - cp $secretsname.crt /etc/nginx/ssl/mycert.cert
  - cp $secretsname.prv /etc/nginx/ssl/mycert.prv
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

Een beveiligde virtuele machine maken

Maak een virtuele machine met az vm create. De gegevens van het certificaat worden geïnjecteerd uit de Sleutelkluis met de parameter --secrets. Net als in het vorige voorbeeld, geeft u ook de cloud-init-configuratie door met de parameter --custom-data:

az vm create \
    --resource-group myResourceGroupAutomate \
    --name myVMWithCerts \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-secured.txt \
    --secrets "$vm_secret"

Het duurt enkele minuten voordat de virtuele machine wordt gemaakt, de pakketten worden geïnstalleerd en de app gestart. Er zijn achtergrondtaken die nog worden uitgevoerd nadat u door de Azure CLI bent teruggeleid naar de prompt. Het duurt mogelijk nog een paar minuten voordat u toegang hebt tot de app. Wanneer de virtuele machine is gemaakt, let op de publicIpAddress weergegeven door de Azure CLI. Dit adres wordt gebruikt voor toegang tot de Node.js-app in een webbrowser.

Zodat beveiligde webverkeer uw virtuele machine bereiken kan, open poort 443 vanaf het Internet met az vm open-port:

az vm open-port \
    --resource-group myResourceGroupAutomate \
    --name myVMWithCerts \
    --port 443

De beveiligde web-app testen

U kunt nu een webbrowser openen en https://< publicIpAddress> invoeren in de adresbalk. Geef uw eigen openbare IP-adres op zoals weergegeven in de uitvoer tijdens het maken van de vorige VM. Als u een zelfondertekend certificaat gebruikt, aanvaardt u de beveiligingswaarschuwing:

Beveiligingswaarschuwing voor web browser accepteren

Uw beveiligde NGINX-site en Node.js app worden vervolgens weergegeven zoals in het volgende voorbeeld:

Beveiligde actieve NGINX-site weergeven

Volgende stappen

In deze zelfstudie hebt u virtuele machines bij de eerste keer opstarten geconfigureerd met cloud-init. U hebt geleerd hoe u:

  • Een cloud-init-configuratiebestand maken
  • Een virtuele machine maken die gebruikmaakt van een cloud-init-bestand
  • Een actieve Node.js-app weergeven nadat de virtuele machine is gemaakt
  • Key Vault gebruiken voor het veilig opslaan van certificaten
  • Beveiligde implementaties van NGINX automatiseren met cloud-init

Ga door naar de volgende zelfstudie voor informatie over het maken van aangepaste VM-installatiekopieën.