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 göre kendi özel görüntülerinizi oluşturabilirsiniz. Bu makalede, Azure'da özel görüntüleri 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'da artık kendi özel görüntülerinizi tanımlamaya ve oluşturmaya yönelik bir Azure Image Builder hizmeti vardır. Azure Image Builder, Packer üzerinde oluşturulmuş olduğundan, mevcut Packer kabuk sağlama betiklerinizi bile 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'da 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 çıktı 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ıya örnek olarak şunlar verilmiştir:

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

Sonraki adımda bu iki komutun çıkışını 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,önceki adımda oluşturulan hizmet sorumlusu kimlik bilgileri gibi Azure kaynaklarını tanımlamanıza olanak tanıyan bir Azure sağlama aracına sahiptir.

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 elde edilir?
client_id Create komutundan az ad sp ilk çıktı satırı - appId
client_secret Create komutundan az ad sp ikinci çıktı satırı - parola
tenant_id Create komutundan az ad sp üçüncü çıktı 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ı buna göre değiştirin.

Ayrıca ubuntu.pkr.hcl adlı bir dosya oluşturabilir ve yukarıdaki parametreler tablosu için kullanılan aşağıdaki içeriği kendi değerlerinizle 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 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 deprovision+userokuması -deprovision için ayarlayın. bayrağı, +user kaynak VM'den tüm kullanıcı hesaplarını kaldırır.

Derleme Paketleyicisi 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ıya örnek olarak şunlar verilmiştir:

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ı, hazırlayıcıları ç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'dan myVM 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

Packer görüntünüzden farklı bir kaynak grubunda veya bölgede VM 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ülenenleri publicIpAddress not alın. 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 Görüntü Oluşturucusu ile mevcut Packer sağlama betiklerini de kullanabilirsiniz.