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_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ść 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:
Następne kroki
Możesz również użyć istniejących skryptów aprowizatora pakietu Packer w programie Azure Image Builder.