كيفية استخدام 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_offer
image_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 الافتراضية، كما هو موضح في المثال التالي:
الخطوات التالية
يمكنك أيضاً استخدام البرامج النصية الحالية لمورد Packer مع Azure Image Builder.