Sdílet prostřednictvím


Použití Packeru k vytvoření imagí 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 distribuci Linuxu a verzi operačního systému. Image můžou zahrnovat předinstalované aplikace a konfigurace. Azure Marketplace poskytuje řadu imagí 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í opensourcového nástroje Packer definovat a vytvářet vlastní image v Azure.

Poznámka:

Azure teď má 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 pracovat s Azure Image Builderem, 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 sestavení 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 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žívat s aplikacemi, službami a automatizačními nástroji, jako je Packer. Řídíte a definujete oprávnění k operacím, které může instanční objekt provádět v Azure.

Vytvořte instanční objekt pomocí příkazu az ad sp create-for-rbac a vypíšete přihlašovací údaje, 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.

Definování šablony Packeru

Pokud chcete vytvořit image, vytvoříte šablonu jako soubor JSON. V šabloně definujete tvůrce a zřizovací nástroje, které provádějí skutečný proces sestavení. Packer má zřizovací nástroj pro Azure , který umožňuje definovat prostředky Azure, jako jsou 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:

Odpovídajícím způsobem image_publishernahraďte , image_offerimage_sku hodnoty a inline příkazy.

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 tuto šablonu rozbalíte, abyste zřídili přihlašovací údaje uživatele, upravte příkaz zřizovacího modulu, který zruší zřízení agenta Azure tak, aby -deprovision deprovision+usermísto toho četl. Příznak +user odebere všechny uživatelské účty ze zdrojového virtuálního počítače.

Image Build Packeru

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

Vytvořte 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řizovacích prostředků a vyčištění nasazení trvá několik minut.

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

Z image teď můžete vytvořit virtuální počítač pomocí příkazu az vm create. Zadejte image, kterou jste vytvořili s parametrem --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ž image Packeru, místo názvu image zadejte 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 přes webový prohlíž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

V Azure Image Builderu můžete také použít existující skripty zřizovacího modulu Packeru.