Jak używać narzędzia Packer do tworzenia obrazów maszyn wirtualnych z systemem Linux na platformie Azure

Dotyczy: ✔️ Maszyny wirtualne z systemem Linux — elastyczne zestawy skalowania ✔️

Każda maszyna wirtualna na platformie Azure jest tworzona na podstawie obrazu definiującego dystrybucję systemu Linux i wersję systemu operacyjnego. Obrazy mogą zawierać wstępnie zainstalowane aplikacje i konfiguracje. Azure Marketplace udostępnia wiele obrazów pierwszej i innej firmy dla najczęściej używanych dystrybucji i środowisk aplikacji lub możesz tworzyć własne niestandardowe obrazy dostosowane do Twoich potrzeb. W tym artykule opisano sposób używania narzędzia open source Packer do definiowania i kompilowania obrazów niestandardowych na platformie Azure.

Uwaga

Platforma Azure ma teraz usługę Azure Image Builder do definiowania i tworzenia własnych obrazów niestandardowych. Narzędzie Azure Image Builder jest oparte na programie Packer, dzięki czemu możesz nawet używać istniejących skryptów aprowizacji powłoki packer. Aby rozpocząć pracę z programem Azure Image Builder, zobacz Tworzenie maszyny wirtualnej z systemem Linux za pomocą narzędzia Azure Image Builder.

Tworzenie grupy zasobów platformy Azure

Podczas procesu kompilacji program Packer tworzy tymczasowe zasoby platformy Azure podczas kompilowanie źródłowej maszyny wirtualnej. Aby przechwycić źródłową maszynę wirtualną do użycia jako obraz, należy zdefiniować grupę zasobów. Dane wyjściowe procesu kompilacji pakietu Packer są przechowywane w tej grupie zasobów.

Utwórz grupę zasobów za pomocą polecenia az group create. Poniższy przykład tworzy grupę zasobów o nazwie myResourceGroup w lokalizacji eastus :

az group create -n myResourceGroup -l eastus

Tworzenie poświadczeń platformy Azure

Pakiet packer uwierzytelnia się na platformie Azure przy użyciu jednostki usługi. Jednostka usługi platformy Azure to tożsamość zabezpieczeń, której można używać z aplikacjami, usługami i narzędziami automatyzacji, takimi jak Packer. Kontrolujesz i definiujesz uprawnienia dotyczące operacji, które jednostka usługi może wykonywać na platformie Azure.

Utwórz jednostkę usługi za pomocą polecenia az ad sp create-for-rbac i wygeneruj poświadczenia wymagane przez program Packer:

az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription_id> --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"

Przykład danych wyjściowych z poprzednich poleceń jest następujący:

{
    "client_id": "f5b6a5cf-fbdf-4a9f-b3b8-3c2cd00225a4",
    "client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
    "tenant_id": "72f988bf-86f1-41af-91ab-2d7cd011db47"
}

Aby uwierzytelnić się na platformie Azure, musisz również uzyskać identyfikator subskrypcji platformy Azure za pomocą polecenia az account show:

az account show --query "{ subscription_id: id }"

Dane wyjściowe z tych dwóch poleceń są używane w następnym kroku.

Definiowanie szablonu pakietu

Aby skompilować obrazy, należy utworzyć szablon jako plik JSON. W szablonie definiuje się konstruktorów i aprowizatorów, które wykonują rzeczywisty proces kompilacji. Pakiet packer ma aprowizację platformy Azure , która umożliwia definiowanie zasobów platformy Azure, takich jak poświadczenia jednostki usługi utworzone w poprzednim kroku.

Utwórz plik o nazwie ubuntu.json i wklej następującą zawartość. Wprowadź własne wartości dla następujących parametrów:

Parametr Gdzie uzyskać
client_id Pierwszy wiersz danych wyjściowych z az ad sp polecenia create — appId
client_secret Drugi wiersz danych wyjściowych z az ad sp polecenia create — hasło
tenant_id Trzeci wiersz danych wyjściowych z az ad sp polecenia create — dzierżawa
subscription_id Dane wyjściowe polecenia az account show
managed_image_resource_group_name Nazwa grupy zasobów utworzonej w pierwszym kroku
managed_image_name Nazwa utworzonego obrazu dysku zarządzanego
{
  "builders": [{
    "type": "azure-arm",

    "client_id": "f5b6a5cf-fbdf-4a9f-b3b8-3c2cd00225a4",
    "client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
    "tenant_id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
    "subscription_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",

    "managed_image_resource_group_name": "myResourceGroup",
    "managed_image_name": "myPackerImage",

    "os_type": "Linux",
    "image_publisher": "canonical",
    "image_offer": "0001-com-ubuntu-server-jammy",
    "image_sku": "22_04-lts",

    "azure_tags": {
        "dept": "Engineering",
        "task": "Image deployment"
    },

    "location": "East US",
    "vm_size": "Standard_DS2_v2"
  }],
  "provisioners": [{
    "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'",
    "inline": [
      "apt-get update",
      "apt-get upgrade -y",
      "apt-get -y install nginx",

      "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"
    ],
    "inline_shebang": "/bin/sh -x",
    "type": "shell"
  }]
}

Uwaga

Odpowiednio zastąp image_publisherwartości , image_offerimage_sku i inline polecenia.

Możesz również utworzyć plik o nazwie ubuntu.pkr.hcl i wkleić następującą zawartość z własnymi wartościami używanymi w powyższej tabeli parametrów.

source "azure-arm" "autogenerated_1" {
  azure_tags = {
    dept = "Engineering"
    task = "Image deployment"
  }
  client_id                         = "f5b6a5cf-fbdf-4a9f-b3b8-3c2cd00225a4"
  client_secret                     = "0e760437-bf34-4aad-9f8d-870be799c55d"
  image_offer                       = "0001-com-ubuntu-server-jammy"
  image_publisher                   = "canonical"
  image_sku                         = "22_04-lts"
  location                          = "East US"
  managed_image_name                = "myPackerImage"
  managed_image_resource_group_name = "myResourceGroup"
  os_type                           = "Linux"
  subscription_id                   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
  tenant_id                         = "72f988bf-86f1-41af-91ab-2d7cd011db47"
  vm_size                           = "Standard_DS2_v2"
}

build {
  sources = ["source.azure-arm.autogenerated_1"]

  provisioner "shell" {
    execute_command = "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'"
    inline          = ["apt-get update", "apt-get upgrade -y", "apt-get -y install nginx", "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"]
    inline_shebang  = "/bin/sh -x"
  }

}

Ten szablon tworzy obraz z systemem Ubuntu 22.04 LTS, instaluje serwer NGINX, a następnie anuluje aprowizowanie maszyny wirtualnej.

Uwaga

Jeśli rozszerzysz ten szablon, aby aprowizować poświadczenia użytkownika, dostosuj polecenie aprowizacji, które anuluje aprowizację agenta platformy Azure, aby odczytać -deprovision , a nie deprovision+user. Flaga +user usuwa wszystkie konta użytkowników ze źródłowej maszyny wirtualnej.

Obraz kompilatora pakietów

Jeśli na komputerze lokalnym nie zainstalowano jeszcze narzędzia Packer, postępuj zgodnie z instrukcjami instalacji programu Packer.

Skompiluj obraz, określając plik szablonu Packer w następujący sposób:

sudo ./packer build ubuntu.json

Obraz można również skompilować, określając plik ubuntu.pkr.hcl w następujący sposób:

sudo packer build ubuntu.pkr.hcl

Przykład danych wyjściowych z poprzednich poleceń jest następujący:

azure-arm output will be in this color.

==> azure-arm: Running builder ...
    azure-arm: Creating Azure Resource Manager (ARM) client ...
==> azure-arm: Creating resource group ...
==> azure-arm:  -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm:  -> Location          : ‘East US’
==> azure-arm:  -> Tags              :
==> azure-arm:  ->> dept : Engineering
==> azure-arm:  ->> task : Image deployment
==> azure-arm: Validating deployment template ...
==> azure-arm:  -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm:  -> DeploymentName    : ‘pkrdpswtxmqm7ly’
==> azure-arm: Deploying deployment template ...
==> azure-arm:  -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm:  -> DeploymentName    : ‘pkrdpswtxmqm7ly’
==> azure-arm: Getting the VM’s IP address ...
==> azure-arm:  -> ResourceGroupName   : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm:  -> PublicIPAddressName : ‘packerPublicIP’
==> azure-arm:  -> NicName             : ‘packerNic’
==> azure-arm:  -> Network Connection  : ‘PublicEndpoint’
==> azure-arm:  -> IP Address          : ‘40.76.218.147’
==> azure-arm: Waiting for SSH to become available...
==> azure-arm: Connected to SSH!
==> azure-arm: Provisioning with shell script: /var/folders/h1/ymh5bdx15wgdn5hvgj1wc0zh0000gn/T/packer-shell868574263
    azure-arm: WARNING! The waagent service will be stopped.
    azure-arm: WARNING! Cached DHCP leases will be deleted.
    azure-arm: WARNING! root password will be disabled. You will not be able to login as root.
    azure-arm: WARNING! /etc/resolvconf/resolv.conf.d/tail and /etc/resolvconf/resolv.conf.d/original will be deleted.
    azure-arm: WARNING! packer account and entire home directory will be deleted.
==> azure-arm: Querying the machine’s properties ...
==> azure-arm:  -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm:  -> ComputeName       : ‘pkrvmswtxmqm7ly’
==> azure-arm:  -> Managed OS Disk   : ‘/subscriptions/guid/resourceGroups/packer-Resource-Group-swtxmqm7ly/providers/Microsoft.Compute/disks/osdisk’
==> azure-arm: Powering off machine ...
==> azure-arm:  -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm:  -> ComputeName       : ‘pkrvmswtxmqm7ly’
==> azure-arm: Capturing image ...
==> azure-arm:  -> Compute ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm:  -> Compute Name              : ‘pkrvmswtxmqm7ly’
==> azure-arm:  -> Compute Location          : ‘East US’
==> azure-arm:  -> Image ResourceGroupName   : ‘myResourceGroup’
==> azure-arm:  -> Image Name                : ‘myPackerImage’
==> azure-arm:  -> Image Location            : ‘eastus’
==> azure-arm: Deleting resource group ...
==> azure-arm:  -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm: Deleting the temporary OS disk ...
==> azure-arm:  -> OS Disk : skipping, managed disk was used...
Build ‘azure-arm’ finished.

==> Builds finished. The artifacts of successful builds are:
--> azure-arm: Azure.ResourceManagement.VMImage:

ManagedImageResourceGroupName: myResourceGroup
ManagedImageName: myPackerImage
ManagedImageLocation: eastus

Utworzenie maszyny wirtualnej, uruchomienie aprowizatorów i oczyszczenie wdrożenia trwa kilka minut.

Tworzenie maszyny wirtualnej na podstawie obrazu platformy Azure

Teraz możesz utworzyć maszynę wirtualną na podstawie obrazu za pomocą polecenia az vm create. Określ obraz utworzony za pomocą parametru --image . Poniższy przykład tworzy maszynę wirtualną o nazwie myVM z obrazu myPackerImage i generuje klucze SSH, jeśli jeszcze nie istnieją:

az vm create \
    --resource-group myResourceGroup \
    --name myVM \
    --image myPackerImage \
    --admin-username azureuser \
    --generate-ssh-keys

Jeśli chcesz utworzyć maszyny wirtualne w innej grupie zasobów lub regionie niż obraz programu Packer, określ identyfikator obrazu, a nie nazwę obrazu. Identyfikator obrazu można uzyskać za pomocą polecenia az image show.

Utworzenie maszyny wirtualnej trwa kilka minut. Po utworzeniu maszyny wirtualnej zanotuj publicIpAddress wyświetlany interfejs wiersza polecenia platformy Azure. Ten adres służy do uzyskiwania dostępu do witryny NGINX za pośrednictwem przeglądarki internetowej.

Aby zezwolić na ruch internetowy do maszyny wirtualnej, otwórz port 80 z Internetu za pomocą polecenia az vm open-port:

az vm open-port \
    --resource-group myResourceGroup \
    --name myVM \
    --port 80

Testowanie maszyny wirtualnej i serwera NGINX

Teraz możesz otworzyć przeglądarkę internetową i wprowadzić ciąg http://publicIpAddress na pasku adresu. Podaj własny publiczny adres IP z procesu tworzenia maszyny wirtualnej. Domyślna strona NGINX jest wyświetlana w następującym przykładzie:

Domyślna witryna serwera NGINX

Następne kroki

Możesz również użyć istniejących skryptów aprowizatora pakietu Packer w programie Azure Image Builder.