Azure'da Linux sanal makine görüntüleri oluşturmak için Packer'ı kullanma

Şunlar için geçerlidir: ✔️ Linux VM'leri ✔️ Esnek ölçek kümeleri

Azure'daki her sanal makine (VM), Linux dağıtımını ve işletim sistemi sürümünü tanımlayan bir görüntüden oluşturulur. Görüntüler önceden yüklenmiş uygulamaları ve yapılandırmaları içerebilir. Azure Market, en yaygın dağıtımlar ve uygulama ortamları için birçok birinci ve üçüncü taraf görüntüsü sağlar veya ihtiyaçlarınıza uygun kendi özel görüntülerinizi oluşturabilirsiniz. Bu makalede, Azure'da özel görüntüler tanımlamak ve oluşturmak için açık kaynak aracı Packer'ın nasıl kullanılacağı ayrıntılı olarak anlatlanmaktadır.

Not

Azure artık kendi özel görüntülerinizi tanımlamak ve oluşturmak için Azure Image Builder adlı bir hizmete sahiptir. Azure Image Builder, Packer üzerinde oluşturulmuş olduğundan mevcut Packer kabuk sağlama betiklerinizi de kullanabilirsiniz. Azure Image Builder'ı kullanmaya başlamak için bkz. Azure Image Builder ile Linux VM oluşturma.

Azure kaynak grubu oluşturma

Derleme işlemi sırasında Packer, kaynak VM'yi oluştururken geçici Azure kaynakları oluşturur. Bu kaynak VM'yi görüntü olarak kullanmak üzere yakalamak için bir kaynak grubu tanımlamanız gerekir. Packer derleme işleminin çıkışı bu kaynak grubunda depolanır.

az group create ile bir kaynak grubu oluşturun. Aşağıdaki örnek eastus konumunda myResourceGroup adlı bir kaynak grubu oluşturur:

az group create -n myResourceGroup -l eastus

Azure kimlik bilgilerini oluşturma

Packer, hizmet sorumlusu kullanarak Azure ile kimlik doğrulaması yapar. Azure hizmet sorumlusu, Packer gibi uygulamalar, hizmetler ve otomasyon araçlarıyla kullanabileceğiniz bir güvenlik kimliğidir. Hizmet sorumlusunun Azure'da gerçekleştirebileceği işlemlere ilişkin izinleri denetler ve tanımlarsınız.

az ad sp create-for-rbac ile bir hizmet sorumlusu oluşturun ve Packer'ın ihtiyaç duyduğu kimlik bilgilerini çıkış olarak kullanın:

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

Yukarıdaki komutlardan alınan çıktının bir örneği aşağıdaki gibidir:

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

Azure'da kimlik doğrulaması yapmak için az account show ile Azure abonelik kimliğinizi de edinmeniz gerekir:

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

Bu iki komutun çıkışını sonraki adımda kullanacaksınız.

Paketleyici şablonunu tanımlama

Görüntü oluşturmak için JSON dosyası olarak bir şablon oluşturursunuz. Şablonda, gerçek derleme işlemini gerçekleştiren oluşturucuları ve hazırlayıcıları tanımlarsınız. Packer'da, önceki adımda oluşturulan hizmet sorumlusu kimlik bilgileri gibi Azure kaynaklarını tanımlamanızı sağlayan bir Azure sağlama hizmeti vardır.

ubuntu.json adlı bir dosya oluşturun ve aşağıdaki içeriği yapıştırın. Aşağıdaki parametreler için kendi değerlerinizi girin:

Parametre Nereden edinileceği
client_id create komutundan az ad sp ilk çıktı satırı - appId
client_secret Create komutundan az ad sp ikinci çıkış satırı - parola
tenant_id Create komutundan az ad sp üçüncü çıkış satırı - kiracı
subscription_id Komutun çıktısı az account show
managed_image_resource_group_name İlk adımda oluşturduğunuz kaynak grubunun adı
managed_image_name Oluşturulan yönetilen disk görüntüsünün adı
{
  "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"
  }]
}

Not

image_publisher, , image_offerimage_sku değerlerini ve inline komutlarını uygun şekilde değiştirin.

Ayrıca ubuntu.pkr.hcl adlı bir dosya oluşturabilir ve yukarıdaki parametreler tablosu için kullanılan kendi değerlerinizle aşağıdaki içeriği yapıştırabilirsiniz.

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

}

Bu şablon bir Ubuntu 22.04 LTS görüntüsü oluşturur, NGINX'i yükler ve ardından VM'nin sağlamasını siler.

Not

Kullanıcı kimlik bilgilerini sağlamak için bu şablonu genişletirseniz, Azure aracısının sağlamasını kaldıran sağlama komutunu yerine okuması -deprovisiondeprovision+useriçin ayarlayın. +user bayrağı, kaynak VM'den tüm kullanıcı hesaplarını kaldırır.

Build Packer görüntüsü

Yerel makinenizde Packer yüklü değilse Packer yükleme yönergelerini izleyin.

Packer şablon dosyanızı aşağıdaki gibi belirterek görüntüyü oluşturun:

sudo ./packer build ubuntu.json

Görüntüyü, ubuntu.pkr.hcl dosyasını aşağıdaki gibi belirterek de oluşturabilirsiniz:

sudo packer build ubuntu.pkr.hcl

Yukarıdaki komutlardan alınan çıktının bir örneği aşağıdaki gibidir:

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

Packer'ın VM'yi oluşturması, sağlamayı çalıştırması ve dağıtımı temizlemesi birkaç dakika sürer.

Azure Görüntüsünden VM oluşturma

Artık az vm create ile Görüntünüzden bir VM oluşturabilirsiniz. parametresiyle --image oluşturduğunuz Görüntüyü belirtin. Aşağıdaki örnek myPackerImage'danmyVM adlı bir VM oluşturur ve henüz yoksa SSH anahtarları oluşturur:

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

Vm'leri Packer görüntünüzden farklı bir kaynak grubunda veya bölgede oluşturmak istiyorsanız, görüntü adı yerine görüntü kimliğini belirtin. Az image show ile görüntü kimliğini alabilirsiniz.

VM'nin oluşturulması birkaç dakika sürer. VM oluşturulduktan sonra Azure CLI tarafından görüntülenen öğesini publicIpAddress not edin. Bu adres, NGINX sitesine bir web tarayıcısı üzerinden erişmek için kullanılır.

Web trafiğinin VM’nize erişmesine izin vermek için, az vm open-port komutuyla İnternet’te 80 numaralı bağlantı noktasını açın:

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

VM ve NGINX'i test edin

Artık bir web tarayıcısı açıp adres çubuğuna http://publicIpAddress ifadesini girebilirsiniz. VM oluşturma işleminden kendi herkese açık IP adresinizi sağlayın. Varsayılan NGINX sayfası aşağıdaki örnekte gösterildiği gibi görüntülenir:

Varsayılan NGINX sitesi

Sonraki adımlar

Azure Image Builder ile mevcut Packer sağlama betiklerini de kullanabilirsiniz.