كيفية استخدام Packer لإنشاء صور جهاز Linux الظاهري في Azure

ينطبق على: ✔️ أجهزة Linux الظاهرية ✔️ مجموعات مقياس مرنة

يتم إنشاء كل جهاز ظاهري (VM) في Azure من صورة تحدد توزيع Linux وإصدار نظام التشغيل. يمكن أن تتضمن الصور تطبيقات وتكوينات مثبتة مسبقاً. يوفر Azure Marketplace العديد من صور الجهات الخارجية والأولى لمعظم التوزيعات وبيئات التطبيقات الشائعة، أو يمكنك إنشاء صور مخصصة مصممة خصوصاً لاحتياجاتك. توضح هذه المقالة كيفية استخدام أداة المصدر المفتوح Packer لتحديد وإنشاء صور مخصصة في Azure.

إشعار

لدى Azure الآن خدمة، Azure Image Builder، لتحديد وإنشاء الصور المخصصة الخاصة بك. تم بناء Azure Image Builder على Packer، بحيث يمكنك حتى استخدام البرامج النصية الحالية لمزود Packer shell معها. لبدء استخدام أداة إنشاء صور Azure، راجع إنشاء جهاز Linux ظاهري باستخدام Azure Image Builder.

إنشاء مجموعة موارد Azure

أثناء عملية الإنشاء، يقوم Packer بإنشاء موارد Azure مؤقتة أثناء إنشاء الجهاز الظاهري المصدر. لالتقاط الجهاز الظاهري المصدر للاستخدام كصورة، يجب عليك تحديد مجموعة موارد. يتم تخزين الإخراج من عملية إنشاء Packer في مجموعة الموارد هذه.

أنشئ مجموعة موارد باستخدام إنشاء مجموعة az. في المثال التالي، سيتم إنشاء مجموعة موارد باسم myResourceGroup في موقع eastus:

az group create -n myResourceGroup -l eastus

إنشاء بيانات اعتماد Azure

يقوم Packer بالمصادقة باستخدام Azure باستخدام كيان الخدمة. كيان خدمة Azure عبارة عن هوية أمان يمكنك استخدامها مع التطبيقات والخدمات وأدوات التشغيل الآلي مثل Packer. يمكنك التحكم في الأذونات وتعريفها فيما يتعلق بالعمليات التي يمكن أن يقوم بها مدير الخدمة في Azure.

إنشاء مبدأ خدمة باستخدام az ad sp create-for-rbac وإخراج بيانات الاعتماد التي يحتاجها Packer:

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

مثال على الإخراج من الأوامر السابقة هو كما يلي:

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

للمصادقة إلى Azure، تحتاج أيضاً إلى الحصول على معرف اشتراك Azure الخاص بك مع إظهار حساب az:

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

يمكنك استخدام الإخراج من هذين الأمرين في الخطوة التالية.

تحديد قالب Packer

لإنشاء صور، يمكنك إنشاء قالب كملف JSON. في القالب، يمكنك تحديد المنشئين والموردين الذين يقومون بتنفيذ عملية الإنشاء الفعلية. يحتوي Packer على مزود Azure يسمح لك بتعريف موارد Azure، مثل بيانات اعتماد الخدمة الأساسية التي تم إنشاؤها في الخطوة السابقة.

قم بإنشاء الملف باسم ubuntu.json والصق المحتويات التالية. أدخل القيم الخاصة بك للمعلمات التالية:

المعلمة‬ أين يمكن الحصول عليها
معرف العميل السطر الأول من الإخراج من az ad spالأمر إنشاء - appId
client_secret السطر الثاني من الإخراج من az ad sp الأمر إنشاء - password
tenant_id السطر الثالث من الإخراج من az ad sp أمر الإنشاء - tenant
subscription_id الإخراج من الأمر az account show
managed_image_resource_group_name اسم مجموعة الموارد التي أنشأتها في الخطوة الأولى
managed_image_name اسم صورة القرص المدار التي تم إنشاؤها
{
  "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"
  }]
}

إشعار

image_publisherاستبدل القيم image_offerimage_sku والأوامر وفقا inline لذلك.

يمكنك أيضًا إنشاء ملف باسم ubuntu.pkr.hcl ولصق المحتوى التالي بالقيم الخاصة بك كما هو مستخدم لجدول المعلمات أعلاه.

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

}

ينشئ هذا القالب صورة Ubuntu 22.04 LTS، ويثبت NGINX، ثم يلغى توفير الجهاز الظاهري.

إشعار

إذا قمت بالتوسع في هذا القالب لتوفير بيانات اعتماد المستخدم، فاضبط أمر التوفير الذي يقوم بإلغاء تزويد عامل Azure بإمكانية القراءة -deprovision بدلاً من deprovision+user. تزيل العلامة +user جميع حسابات المستخدمين من الجهاز الظاهري المصدر.

بناء صورة Packer

إذا لم يكن لديك Packer مثبتاً بالفعل على جهازك المحلي، فاتبع إرشادات تثبيت Packer.

قم بإنشاء الصورة عن طريق تحديد ملف قالب Packer كما يلي:

sudo ./packer build ubuntu.json

يمكنك أيضًا إنشاء الصورة عن طريق تحديد ملف ubuntu.pkr.hcl كما يلي:

sudo packer build ubuntu.pkr.hcl

مثال على الإخراج من الأوامر السابقة هو كما يلي:

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 بإنشاء الجهاز الظاهري وتشغيل الموردات وتنظيف النشر.

إنشاء جهاز ظاهري من صورة Azure

يمكنك الآن إنشاء جهاز ظاهري من الصور لديك باستخدام az vm create. حدد الصورة التي أنشأتها باستخدام المعلمة --image. ينشئ المثال التالي جهازًا ظاهريًا يُسمى myVM، من myPackerImage وينشئ مفاتيح SSH إذا لم تكن موجودة بالفعل:

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

إذا كنت ترغب في إنشاء أجهزة ظاهرية في مجموعة موارد أو منطقة مختلفة عن صورة Packer الخاصة بك، فحدد معرف الصورة بدلاً من اسم الصورة. يمكنك الحصول على معرف الصورة مع عرض الصورة az.

يستغرق إنشاء جهازاً ظاهرياً بضع دقائق. عندما يتم إنشاء الجهاز الظاهري، قم بتدوين publicIpAddress الظاهرة بواسطة Azure CLI. يستخدم هذا العنوان للوصول إلى موقع NGINX عبر متصفح ويب.

للسماح لحركة مرور الويب بالوصول إلى الجهاز الظاهري، افتح المنفذ 80 من الإنترنت باستخدام منفذaz vm open-port

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

اختبار الجهاز الظاهري و NGINX

والآن يُمكنك فتح مستعرض الويب وإدخال http://publicIpAddress في شريط العناوين. وفِّر عنوان IP العام الخاص بك من عملية إنشاء جهاز ظاهري. يتم عرض صفحة NGINX الافتراضية، كما هو موضح في المثال التالي:

موقع NGINX الافتراضي

الخطوات التالية

يمكنك أيضاً استخدام البرامج النصية الحالية لمورد Packer مع Azure Image Builder.