Udostępnij przez


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 wewnętrznych i zewnętrznych dla najczęściej używanych dystrybucjach i środowisk aplikacji lub możesz tworzyć własne niestandardowe obrazy dostosowane do Twoich potrzeb. W tym artykule szczegółowo 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. Usługa Azure Image Builder jest oparta na programie Packer, dzięki czemu możesz nawet używać istniejących skryptów aprowizacji powłoki Packer. Aby rozpocząć pracę z usługą Azure Image Builder, zobacz Tworzenie maszyny wirtualnej z systemem Linux przy użyciu narzędzia Azure Image Builder.

Tworzenie grupy zasobów platformy Azure

Podczas procesu kompilacji program Packer tworzy tymczasowe zasoby platformy Azure podczas kompilowania ź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 z procesu kompilacji Packer są przechowywane w tej grupie zasobów.

Utwórz grupę zasobów za pomocą az group create. W poniższym przykładzie pokazano tworzenie grupy zasobów o nazwie myResourceGroup w lokalizacji eastus:

az group create -n myResourceGroup -l eastus

Tworzenie poświadczeń platformy Azure

Narzędzie Packer uwierzytelnia się na platformie Azure przy użyciu pryncypału usługi. Zasada usługi 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 tożsamość usługi za pomocą polecenia az ad sp create-for-rbac i wyprowadź poświadczenia, których potrzebuje Packer.

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

Przykładowe dane wyjściowe z poprzednich poleceń są następujące:

{
    "client_id": "00001111-aaaa-2222-bbbb-3333cccc4444",
    "client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
    "tenant_id": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}

Aby uwierzytelnić się na platformie Azure, musisz również uzyskać identyfikator subskrypcji Azure, używając 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 programu Packer

Aby utworzyć obrazy, należy utworzyć szablon jako plik JSON. W szablonie definiuje się konstruktorów i aprowizatorów, które wykonują rzeczywisty proces kompilacji. Packer ma provisioner dla platformy Azure, który umożliwia definiowanie zasobów platformy Azure, takich jak poświadczenia obiektu 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 – tenant
subscription_id Dane wyjściowe polecenia az account show
zarządzana_nazwa_grupy_zasobów_obrazu Nazwa grupy zasobów utworzonej w pierwszym kroku
zarządzana_nazwa_obrazu Nazwa utworzonego obrazu dysku zarządzanego
{
  "builders": [{
    "type": "azure-arm",

    "client_id": "00001111-aaaa-2222-bbbb-3333cccc4444",
    "client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
    "tenant_id": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "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

Zastąp wartości image_publisher, image_offer, image_sku oraz polecenia inline odpowiednio.

Możesz również utworzyć plik o nazwie ubuntu.pkr.hcl i wkleić poniższą zawartość, zastępując własnymi wartościami tak, jak w powyższej tabeli parametrów.

source "azure-arm" "autogenerated_1" {
  azure_tags = {
    dept = "Engineering"
    task = "Image deployment"
  }
  client_id                         = "00001111-aaaa-2222-bbbb-3333cccc4444"
  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                         = "aaaabbbb-0000-cccc-1111-dddd2222eeee"
  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 systemu Ubuntu 22.04 LTS, instaluje serwer NGINX, a następnie dezaktywuje maszynę wirtualną.

Uwaga

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

Obraz programu Build Packer

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

Zbuduj obraz, podają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ładowe dane wyjściowe z poprzednich poleceń są następujące:

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 przez Packer, uruchomienie narzędzi konfiguracyjnych i wyczyszczenie wdrożenia trwa kilka minut.

Tworzenie maszyny wirtualnej na podstawie obrazu platformy Azure

Teraz możesz utworzyć maszynę wirtualną z 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 na podstawie 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 wartość wyświetlaną przez 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 sieciowy do maszyny wirtualnej, otwórz port 80 dla ruchu z Internetu, używając 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ć http://publicIpAddress na pasku adresu. Podaj własny publiczny adres IP z procesu tworzenia maszyny wirtualnej. Domyślna strona NGINX jest wyświetlana w poniższym przykładzie:

Domyślna witryna serwera NGINX

Następne kroki

Możesz również użyć istniejących skryptów aprowizatora Packer z narzędziem Azure Image Builder.