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. Witryna 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 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ą polecenia 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 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 wprowadź 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ładowe dane wyjściowe z poprzednich poleceń są następujące:
{
"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 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. Pakiet Packer ma aprowizację dla 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
Zastąp odpowiednio image_publisher
wartości , image_offer
image_sku
i inline
polecenia.
Możesz również utworzyć plik o nazwie ubuntu.pkr.hcl i wkleić następującą zawartość własnymi wartościami, jak użyto dla 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 LTS z systemem Ubuntu 22.04, instaluje serwer NGINX, a następnie anuluje aprowizowanie maszyny wirtualnej.
Uwaga
Jeśli rozszerzysz ten szablon, aby aprowizować poświadczenia użytkownika, dostosuj polecenie osoby aprowizacji, które anuluje aprowizację agenta platformy Azure, aby odczytać -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.
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ł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, uruchomienie aprowizacji i wyczyszczenie 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
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 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 poniższym przykładzie:
Następne kroki
Możesz również użyć istniejących skryptów inicjowania obsługi administracyjnej pakietu za pomocą narzędzia Azure Image Builder.