Jak pomocí Packeru vytvářet image virtuálních počítačů s Linuxem v Azure

Platí pro: ✔️ Flexibilní škálovací sady virtuálních počítačů s ✔️ Linuxem

Každý virtuální počítač v Azure se vytvoří z image, která definuje linuxovou distribuci a verzi operačního systému. Image můžou obsahovat předinstalované aplikace a konfigurace. Azure Marketplace poskytuje mnoho imagí od třetích stran pro nejběžnější distribuce a aplikační prostředí nebo si můžete vytvořit vlastní image přizpůsobené vašim potřebám. Tento článek podrobně popisuje, jak pomocí nástroje open source Packer definovat a sestavovat vlastní image v Azure.

Poznámka

Azure teď nabízí službu Azure Image Builder pro definování a vytváření vlastních imagí. Azure Image Builder je založený na Packeru, takže s ním můžete dokonce použít stávající skripty zřizovacího prostředí Packeru. Pokud chcete začít používat Azure Image Builder, přečtěte si téma Vytvoření virtuálního počítače s Linuxem pomocí Azure Image Builderu.

Vytvoření skupiny prostředků Azure

Během procesu sestavování vytvoří Packer dočasné prostředky Azure při sestavování zdrojového virtuálního počítače. Pokud chcete zachytit zdrojový virtuální počítač pro použití jako image, musíte definovat skupinu prostředků. Výstup z procesu sestavení Packeru je uložený v této skupině prostředků.

Vytvořte skupinu prostředků pomocí příkazu az group create. Následující příklad vytvoří skupinu prostředků myResourceGroup v umístění eastus :

az group create -n myResourceGroup -l eastus

Vytvoření přihlašovacích údajů Azure

Packer se ověřuje v Azure pomocí instančního objektu. Instanční objekt Azure je identita zabezpečení, kterou můžete použít s aplikacemi, službami a automatizačními nástroji, jako je Packer. Řídíte a definujete oprávnění k tomu, jaké operace může instanční objekt provádět v Azure.

Pomocí příkazu az ad sp create-for-rbac vytvořte instanční objekt a vytvořte výstup přihlašovacích údajů, které Packer potřebuje:

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

Příklad výstupu z předchozích příkazů je následující:

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

Pokud se chcete ověřit v Azure, musíte také získat ID předplatného Azure pomocí příkazu az account show:

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

Výstup z těchto dvou příkazů použijete v dalším kroku.

Definovat šablonu Packeru

Při vytváření imagí vytvoříte šablonu jako soubor JSON. V šabloně definujete tvůrce a zřizovací procesy, které provádějí vlastní proces sestavení. Packer má zřizovací nástroj pro Azure , který umožňuje definovat prostředky Azure, například přihlašovací údaje instančního objektu vytvořené v předchozím kroku.

Vytvořte soubor s názvem ubuntu.json a vložte následující obsah. Zadejte vlastní hodnoty pro následující parametry:

Parametr Kde získat
client_id První řádek výstupu příkazu az ad sp create – appId
client_secret Druhý řádek výstupu příkazu az ad sp create – heslo
tenant_id Třetí řádek výstupu příkazu az ad sp create – tenant
subscription_id Výstup z az account show příkazu
managed_image_resource_group_name Název skupiny prostředků, kterou jste vytvořili v prvním kroku
managed_image_name Název vytvořené image spravovaného disku
{
  "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"
  }]
}

Poznámka

image_publisherimage_offerimage_sku Nahraďte hodnoty a příkazy , odpovídajícím inline způsobem.

Můžete také vytvořit soubor s názvem ubuntu.pkr.hcl a vložit následující obsah s vlastními hodnotami, které se používají pro výše uvedenou tabulku parametrů.

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"
  }

}

Tato šablona sestaví image Ubuntu 22.04 LTS, nainstaluje NGINX a pak zruší zřízení virtuálního počítače.

Poznámka

Pokud rozbalíte tuto šablonu a zřídíte přihlašovací údaje uživatele, upravte příkaz zřizovacího nástroje, který zruší zřízení agenta Azure tak, aby místo načetl -deprovisiondeprovision+user. Příznak +user odebere všechny uživatelské účty ze zdrojového virtuálního počítače.

Image Build Packeru

Pokud ještě nemáte packer nainstalovaný na místním počítači, postupujte podle pokynů k instalaci Packeru.

Sestavte image zadáním souboru šablony Packeru následujícím způsobem:

sudo ./packer build ubuntu.json

Image můžete také sestavit zadáním souboru ubuntu.pkr.hcl následujícím způsobem:

sudo packer build ubuntu.pkr.hcl

Příklad výstupu z předchozích příkazů je následující:

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

Sestavení virtuálního počítače, spuštění zřizovatelů a vyčištění nasazení trvá několik minut.

Vytvoření virtuálního počítače z image Azure

Virtuální počítač teď můžete vytvořit z image pomocí příkazu az vm create. Zadejte image, kterou jste vytvořili pomocí parametru --image . Následující příklad vytvoří virtuální počítač myVM z myPackerImage a vygeneruje klíče SSH, pokud ještě neexistují:

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

Pokud chcete vytvořit virtuální počítače v jiné skupině prostředků nebo oblasti, než je vaše image Packeru, zadejte MÍSTO názvu image ID image. ID image můžete získat pomocí příkazu az image show.

Vytvoření virtuálního počítače trvá několik minut. Po vytvoření virtuálního počítače si poznamenejte publicIpAddress zobrazení v Azure CLI. Tato adresa se používá pro přístup k webu NGINX prostřednictvím webového prohlížeče.

Pokud chcete umožnit přístup k virtuálnímu počítači webovému provozu, otevřete port 80 z internetu pomocí příkazu az vm open-port:

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

Testování virtuálního počítače a NGINX

Nyní můžete otevřít webový prohlížeč a do adresního řádku zadat http://publicIpAddress. Zadejte vlastní veřejnou IP adresu získanou při vytváření virtuálního počítače. Výchozí stránka NGINX se zobrazí jako v následujícím příkladu:

Výchozí web NGINX

Další kroky

S Azure Image Builderem můžete také použít existující skripty zřizovacího modulu Packer.