Samouczek — dostosowywanie maszyny wirtualnej z systemem Linux na platformie Azure podczas pierwszego rozruchu za pomocą pakietu cloud-initTutorial - How to use cloud-init to customize a Linux virtual machine in Azure on first boot

W poprzednim samouczku przedstawiono sposób nawiązywania połączenia SSH z maszyną wirtualną oraz ręcznego instalowania NGINX.In a previous tutorial, you learned how to SSH to a virtual machine (VM) and manually install NGINX. Aby w szybki i spójny sposób utworzyć maszyny wirtualne, stosuje się na ogół jakąś formę automatyzacji.To create VMs in a quick and consistent manner, some form of automation is typically desired. Typową metodą dostosowywania maszyny wirtualnej podczas pierwszego rozruchu jest użycie pakietu cloud-init.A common approach to customize a VM on first boot is to use cloud-init. Ten samouczek zawiera informacje na temat wykonywania następujących czynności:In this tutorial you learn how to:

  • Tworzenie pliku konfiguracji cloud-initCreate a cloud-init config file
  • Tworzenie maszyny wirtualnej korzystającej z pakietu cloud-initCreate a VM that uses a cloud-init file
  • Wyświetlanie uruchomionej aplikacji Node.js po utworzeniu maszyny wirtualnejView a running Node.js app after the VM is created
  • Używanie usługi Key Vault do bezpiecznego przechowywania certyfikatówUse Key Vault to securely store certificates
  • Automatyzacja bezpiecznych wdrożeń NGINX przy użyciu pakietu cloud-initAutomate secure deployments of NGINX with cloud-init

Jeśli zdecydujesz się zainstalować interfejs wiersza polecenia i korzystać z niego lokalnie, ten samouczek będzie wymagał interfejsu wiersza polecenia platformy Azure w wersji 2.0.30 lub nowszej.If you choose to install and use the CLI locally, this tutorial requires that you are running the Azure CLI version 2.0.30 or later. Uruchom polecenie az --version, aby dowiedzieć się, jaka wersja jest używana.Run az --version to find the version. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.If you need to install or upgrade, see Install Azure CLI.

Omówienie pakietu cloud-initCloud-init overview

Cloud-init to powszechnie używana metoda dostosowywania maszyny wirtualnej z systemem Linux podczas jej pierwszego rozruchu.Cloud-init is a widely used approach to customize a Linux VM as it boots for the first time. Za pomocą pakietu cloud-init można instalować pakiety i zapisywać pliki lub konfigurować użytkowników i zabezpieczenia.You can use cloud-init to install packages and write files, or to configure users and security. Pakiet cloud-init jest uruchamiany w trakcie początkowego rozruchu, więc do zastosowania konfiguracji nie są wymagane żadne dodatkowe kroki ani agenci.As cloud-init runs during the initial boot process, there are no additional steps or required agents to apply your configuration.

Pakiet cloud-init działa również w różnych dystrybucjach.Cloud-init also works across distributions. Przykładowo nie używa się poleceń apt-get install lub yum install do zainstalowania pakietu.For example, you don't use apt-get install or yum install to install a package. Zamiast tego możesz zdefiniować listę pakietów do zainstalowania.Instead you can define a list of packages to install. Pakiet cloud-init automatycznie używa natywnego narzędzia do zarządzania pakietami dla wybranej dystrybucji.Cloud-init automatically uses the native package management tool for the distro you select.

Wraz z partnerami pracujemy nad tym, aby pakiet cloud-init był uwzględniany i uruchamiany w obrazach, których dostarczają na platformie Azure.We are working with our partners to get cloud-init included and working in the images that they provide to Azure. W poniższej tabeli przedstawiono bieżącą dostępność pakietu cloud-init w obrazach na platformie Azure:The following table outlines the current cloud-init availability on Azure platform images:

WydawcaPublisher OfertaOffer SKUSKU WersjaVersion gotowe pakietu cloud-initcloud-init ready
CanonicalCanonical UbuntuServerUbuntuServer 18.04-LTS18.04-LTS najnowszalatest takyes
CanonicalCanonical UbuntuServerUbuntuServer 16.04-LTS16.04-LTS najnowszalatest takyes
CanonicalCanonical UbuntuServerUbuntuServer 14.04.5-LTS14.04.5-LTS najnowszalatest takyes
CoreOSCoreOS CoreOSCoreOS StableStable najnowszalatest takyes
OpenLogic 7,6OpenLogic 7.6 CentOSCentOS 7-CI7-CI najnowszalatest wersja zapoznawczapreview
RedHat 7,6RedHat 7.6 RHELRHEL 7-RAW-CI7-RAW-CI 7.6.20190724187.6.2019072418 takyes
RedHat 7,7RedHat 7.7 RHELRHEL 7-RAW-CI7-RAW-CI 7.7.20190816017.7.2019081601 wersja zapoznawczapreview

Tworzenie pliku konfiguracji cloud-initCreate cloud-init config file

Aby zobaczyć pakiet cloud-init w akcji, utwórz maszynę wirtualną instalującą NGINX i uruchamiającą prostą aplikację Node.js „Hello World”.To see cloud-init in action, create a VM that installs NGINX and runs a simple 'Hello World' Node.js app. Następująca konfiguracja cloud-init instaluje wymagane pakiety, tworzy aplikację Node.js, a następnie inicjuje i uruchamia aplikację.The following cloud-init configuration installs the required packages, creates a Node.js app, then initialize and starts the app.

W wierszu polecenia bash lub w Cloud Shell Utwórz plik o nazwie Cloud-init. txt i wklej następującą konfigurację.At your bash prompt or in the Cloud Shell, create a file named cloud-init.txt and paste the following configuration. Na przykład wpisz sensible-editor cloud-init.txt, aby utworzyć plik i wyświetlić listę dostępnych edytorów.For example, type sensible-editor cloud-init.txt to create the file and see a list of available editors. Upewnij się, że skopiowano cały plik cloud-init chmury, a szczególnie pierwszy wiersz:Make sure that the whole cloud-init file is copied correctly, especially the first line:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    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
    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

Aby uzyskać więcej informacji o opcjach konfiguracji pakietu cloud-init, zobacz przykłady konfiguracji pakietu cloud-init.For more information about cloud-init configuration options, see cloud-init config examples.

Tworzenie maszyny wirtualnejCreate virtual machine

Zanim będzie można utworzyć maszynę wirtualną, utwórz grupę zasobów za pomocą polecenia az group create.Before you can create a VM, create a resource group with az group create. Poniższy przykład obejmuje tworzenie grupy zasobów o nazwie myResourceGroupAutomate w lokalizacji eastus:The following example creates a resource group named myResourceGroupAutomate in the eastus location:

az group create --name myResourceGroupAutomate --location eastus

Utwórz maszynę wirtualną za pomocą polecenia az vm create.Now create a VM with az vm create. Użyj parametru --custom-data do przekazania w pliku konfiguracji cloud-init.Use the --custom-data parameter to pass in your cloud-init config file. Podaj pełną ścieżkę do pliku konfiguracji cloud-init.txt, jeśli plik został zapisany poza aktualnym katalogiem roboczym.Provide the full path to the cloud-init.txt config if you saved the file outside of your present working directory. W poniższym przykładzie utworzono maszynę wirtualną o nazwie myVM:The following example creates a VM named myVM:

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

Utworzenie maszyny wirtualnej, zainstalowanie pakietów i uruchomienie aplikacji potrwa kilka minut.It takes a few minutes for the VM to be created, the packages to install, and the app to start. Pewne zadania w tle działają nadal po powrocie do wiersza polecenia w interfejsie wiersza polecenia platformy Azure.There are background tasks that continue to run after the Azure CLI returns you to the prompt. Może upłynąć kilka minut, zanim będzie można uzyskać dostęp do aplikacji.It may be another couple of minutes before you can access the app. Podczas tworzenia maszyny wirtualnej zanotuj wartość publicIpAddress wyświetlaną w wierszu polecenia platformy Azure.When the VM has been created, take note of the publicIpAddress displayed by the Azure CLI. Ten adres służy do uzyskiwania dostępu do aplikacji Node.js w przeglądarce internetowej.This address is used to access the Node.js app via a web browser.

Aby zezwolić na ruch internetowy do maszyny wirtualnej, otwórz port 80 z Internetu za pomocą polecenia az vm open-port:To allow web traffic to reach your VM, open port 80 from the Internet with az vm open-port:

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

Testowanie aplikacji internetowejTest web app

Teraz możesz otworzyć przeglądarkę internetową i wprowadzić http://<publicIpAddress > na pasku adresu.Now you can open a web browser and enter http://<publicIpAddress> in the address bar. Podaj własny publiczny adres IP z procesu tworzenia maszyny wirtualnej.Provide your own public IP address from the VM create process. Aplikacja Node.js jest wyświetlana jak w poniższym przykładzie:Your Node.js app is displayed as shown in the following example:

Wyświetlanie uruchomionej witryny serwera NGINX

Wstrzykiwanie certyfikatów z usługi Key VaultInject certificates from Key Vault

Ta opcjonalna sekcja przedstawia sposób bezpiecznego przechowywania certyfikatów w usłudze Azure Key Vault oraz wstrzykiwania ich podczas wdrażania maszyny wirtualnej.This optional section shows how you can securely store certificates in Azure Key Vault and inject them during the VM deployment. Zamiast używania niestandardowego obrazu zawierającego wbudowane certyfikaty, ten proces upewnia się, że najbardziej aktualne certyfikaty są wstrzykiwane do maszyny wirtualnej podczas pierwszego rozruchu.Rather than using a custom image that includes the certificates baked-in, this process ensures that the most up-to-date certificates are injected to a VM on first boot. W trakcie procesu certyfikaty nigdy nie opuszczają platformy Azure oraz nie są udostępniane w skrypcie, historii wiersza polecenia ani w szablonie.During the process, the certificate never leaves the Azure platform or is exposed in a script, command-line history, or template.

Usługa Azure Key Vault chroni klucze kryptograficzne i klucze tajne, takie jak certyfikaty lub hasła.Azure Key Vault safeguards cryptographic keys and secrets, such as certificates or passwords. Usługa Key Vault pomaga usprawniać proces zarządzania kluczami i pozwala zachować kontrolę nad kluczami, które mają dostęp do danych i szyfrują je.Key Vault helps streamline the key management process and enables you to maintain control of keys that access and encrypt your data. W tym scenariuszu wprowadzono pewne pojęcia usługi Key Vault w celu utworzenia i użycia certyfikatu, chociaż nie jest to wyczerpujące omówienie sposobu użycia usługi Key Vault.This scenario introduces some Key Vault concepts to create and use a certificate, though is not an exhaustive overview on how to use Key Vault.

Poniższa procedura przedstawia:The following steps show how you can:

  • Tworzenie usługi Azure Key VaultCreate an Azure Key Vault
  • Generowanie lub przekazywanie certyfikatu do usługi Key VaultGenerate or upload a certificate to the Key Vault
  • Tworzenie klucza tajnego z certyfikatu w celu wstrzyknięcia do maszyny wirtualnejCreate a secret from the certificate to inject in to a VM
  • Tworzenie maszyny wirtualnej i wstrzykiwanie certyfikatuCreate a VM and inject the certificate

Tworzenie usługi Azure Key VaultCreate an Azure Key Vault

Najpierw utwórz usługę Key Vault za pomocą polecenia az keyvault create i włącz ją do użycia podczas wdrażania maszyny wirtualnej.First, create a Key Vault with az keyvault create and enable it for use when you deploy a VM. Każda usługa Key Vault wymaga unikatowej nazwy, która powinna zawierać tylko małe litery.Each Key Vault requires a unique name, and should be all lower case. Zamień wartość mykeyvault w poniższym przykładzie na własną unikatową nazwę usługi Key Vault:Replace mykeyvault in the following example with your own unique Key Vault name:

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

Generowanie certyfikatu i zapisywanie go w usłudze Key VaultGenerate certificate and store in Key Vault

Do użycia w środowisku produkcyjnym należy zaimportować prawidłowy certyfikat podpisany przez zaufanego dostawcę, używając polecenia az keyvault certificate import.For production use, you should import a valid certificate signed by trusted provider with az keyvault certificate import. W tym samouczku poniższy przykład przedstawia, jak można wygenerować certyfikat z podpisem własnym za pomocą polecenia az keyvault certificate create z użyciem domyślnych zasad certyfikatów:For this tutorial, the following example shows how you can generate a self-signed certificate with az keyvault certificate create that uses the default certificate policy:

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

Przygotowywanie certyfikatu do użycia z maszyną wirtualnąPrepare certificate for use with VM

Aby użyć certyfikatu podczas tworzenia maszyny wirtualnej, uzyskaj identyfikator certyfikatu za pomocą polecenia az keyvault secret list-versions.To use the certificate during the VM create process, obtain the ID of your certificate with az keyvault secret list-versions. Maszyna wirtualna wymaga wstrzyknięcia certyfikatu w określonym formacie podczas rozruchu, więc należy skonwertować certyfikat przy użyciu polecenia az vm secret format.The VM needs the certificate in a certain format to inject it on boot, so convert the certificate with az vm secret format. W poniższym przykładzie przypisano dane wyjściowe tych poleceń do zmiennych w celu łatwiejszego użycia w następnych krokach:The following example assigns the output of these commands to variables for ease of use in the next steps:

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)

Tworzenie konfiguracji cloud-init do zabezpieczenia serwera NGINXCreate cloud-init config to secure NGINX

Podczas tworzenia maszyny wirtualnej certyfikaty i klucze są przechowywane w chronionym katalogu /var/lib/agentawaagent/ .When you create a VM, certificates and keys are stored in the protected /var/lib/waagent/ directory. Aby zautomatyzować dodawanie certyfikatu do maszyny wirtualnej i konfigurowanie serwera NGINX, możesz użyć zaktualizowanego pliku konfiguracji cloud-init z poprzedniego przykładu.To automate adding the certificate to the VM and configuring NGINX, you can use an updated cloud-init config from the previous example.

Utwórz plik o nazwie cloud-init-secured.txt i wklej następującą konfigurację.Create a file named cloud-init-secured.txt and paste the following configuration. Jeśli używasz Cloud Shell, Utwórz plik konfiguracji Cloud-init w tym miejscu, a nie na komputerze lokalnym.If you use the Cloud Shell, create the cloud-init config file there and not on your local machine. Na przykład wpisz sensible-editor cloud-init-secured.txt, aby utworzyć plik i wyświetlić listę dostępnych edytorów.For example, type sensible-editor cloud-init-secured.txt to create the file and see a list of available editors. Upewnij się, że skopiowano cały plik cloud-init chmury, a szczególnie pierwszy wiersz:Make sure that the whole cloud-init file is copied correctly, especially the first line:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    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
    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

Tworzenie bezpiecznej maszyny wirtualnejCreate secure VM

Utwórz maszynę wirtualną za pomocą polecenia az vm create.Now create a VM with az vm create. Dane certyfikatu są wstrzykiwane z usługi Key Vault za pomocą parametru --secrets.The certificate data is injected from Key Vault with the --secrets parameter. Tak jak w poprzednim przykładzie możesz też przekazać plik konfiguracji cloud-init za pomocą parametru --custom-data:As in the previous example, you also pass in the cloud-init config with the --custom-data parameter:

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

Utworzenie maszyny wirtualnej, zainstalowanie pakietów i uruchomienie aplikacji potrwa kilka minut.It takes a few minutes for the VM to be created, the packages to install, and the app to start. Pewne zadania w tle działają nadal po powrocie do wiersza polecenia w interfejsie wiersza polecenia platformy Azure.There are background tasks that continue to run after the Azure CLI returns you to the prompt. Może upłynąć kilka minut, zanim będzie można uzyskać dostęp do aplikacji.It may be another couple of minutes before you can access the app. Podczas tworzenia maszyny wirtualnej zanotuj wartość publicIpAddress wyświetlaną w wierszu polecenia platformy Azure.When the VM has been created, take note of the publicIpAddress displayed by the Azure CLI. Ten adres służy do uzyskiwania dostępu do aplikacji Node.js w przeglądarce internetowej.This address is used to access the Node.js app via a web browser.

Aby zezwolić na bezpieczny ruch internetowy do maszyny wirtualnej, otwórz port 443 z Internetu za pomocą polecenia az vm open-port:To allow secure web traffic to reach your VM, open port 443 from the Internet with az vm open-port:

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

Testowanie bezpiecznej aplikacji internetowejTest secure web app

Teraz możesz otworzyć przeglądarkę sieci Web i wprowadzić https://<publicIpAddress > na pasku adresu.Now you can open a web browser and enter https://<publicIpAddress> in the address bar. Podaj własny publiczny adres IP, widoczny w danych wyjściowych poprzedniego procesu tworzenia maszyny wirtualnej.Provide your own public IP address as shown in the output of the previous VM create process. Jeśli został użyty certyfikat z podpisem własnym, zaakceptuj ostrzeżenie dotyczące zabezpieczeń:Accept the security warning if you used a self-signed certificate:

Akceptowanie ostrzeżenia dotyczącego zabezpieczeń w przeglądarce sieci Web

Zostanie wyświetlona zabezpieczona witryna serwera NGINX oraz aplikacja Node.js, tak jak w poniższym przykładzie:Your secured NGINX site and Node.js app is then displayed as in the following example:

Wyświetlanie uruchomionej zabezpieczonej witryny serwera NGINX

Następne krokiNext steps

W tym samouczku skonfigurowano maszyny wirtualne podczas pierwszego rozruchu przy użyciu pakietu cloud-init.In this tutorial, you configured VMs on first boot with cloud-init. W tym samouczku omówiono:You learned how to:

  • Tworzenie pliku konfiguracji cloud-initCreate a cloud-init config file
  • Tworzenie maszyny wirtualnej korzystającej z pakietu cloud-initCreate a VM that uses a cloud-init file
  • Wyświetlanie uruchomionej aplikacji Node.js po utworzeniu maszyny wirtualnejView a running Node.js app after the VM is created
  • Używanie usługi Key Vault do bezpiecznego przechowywania certyfikatówUse Key Vault to securely store certificates
  • Automatyzacja bezpiecznych wdrożeń NGINX przy użyciu pakietu cloud-initAutomate secure deployments of NGINX with cloud-init

Przejdź do następnego samouczka, aby dowiedzieć się, jak tworzyć niestandardowe obrazy maszyn wirtualnych.Advance to the next tutorial to learn how to create custom VM images.