البرنامج التعليمي - كيفية استخدام cloud-init لتخصيص جهاز Linux الظاهري في Azure عند التمهيد الأول

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

في برنامج تعليمي سابق، تعلمت كيفية استخدام SSH على جهاز ظاهري (VM) وتثبيت NGINX يدويًّا. لإنشاء أجهزة ظاهرية بطريقة سريعة ومتسقة، عادة ما تكون بعض أشكال الأتمتة مطلوبة. تتمثل الطريقة الشائعة لتخصيص جهاز افتراضي في التمهيد الأول في استخدام cloud-init. في هذا البرنامج التعليمي، ستتعرف على كيفية القيام بما يلي:

  • إنشاء ملف تهيئة cloud-init
  • إنشاء جهاز ظاهري يستخدم ملف cloud-init
  • عرض تطبيق Node.js قيد التشغيل بعد إنشاء الجهاز الظاهري
  • استخدم Key Vault لتخزين الشهادات بأمان
  • أتمتة عمليات النشر الآمنة لـ NGINX باستخدام cloud-init

إذا اخترت تثبيت CLI واستخدامه محليًّا، فإن هذا البرنامج التعليمي يتطلب تشغيل الإصدار 2.0.30 من Azure CLI أو إصدار لاحق. قم بتشغيل az --version للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فيُرجى الرجوع إلى تثبيت Azure CLI.

نظرة عامة على Cloud-init

تعد Cloud-initطريقة مستخدمة على نطاق واسع لتخصيص جهاز Linux ظاهري أثناء تشغيله لأول مرة. يمكنك استخدام cloud-init لتثبيت الحزم وكتابة الملفات، أو لتكوين المستخدمين والأمان. نظرًا لأن أداة cloud-init تعمل أثناء عملية التمهيد الأولية، فلا توجد خطوات إضافية أو عوامل مطلوبة لتطبيق التكوين الخاص بك.

تعمل Cloud-init أيضًا عبر التوزيعات. على سبيل المثال، لا تستخدم تثبيت apt-getأو تثبيت تثبيت yum لتثبيتحزمة. بدلًا من ذلك يمكنك تحديد قائمة الحزم لتثبيتها. يستخدم Cloud-init تلقائيًّا أداة إدارة الحزمة الأصلية للتوزيعة التي تحددها.

نحن نعمل مع شركائنا لتضمين السحابة الأولية والعمل في الصور التي يقدمونها إلى Azure. للحصول على معلومات تفصيلية عن دعم السحابة المبدئية لكل توزيع، راجع دعم السحابة الأولية للأجهزة الافتراضية في Azure.

إنشاء ملف تهيئة cloud-init

لمشاهدة بدء cloud-init، قم بإنشاء جهاز ظاهري يقوم بتثبيت NGINX وتشغيل تطبيق Node.js بشكل بسيط"Hello World". تقوم أداة cloud-init بتثبيت الحزم المطلوبة، وإنشاء تطبيق Node.js ، ثم تهيئة التطبيق وبدء تشغيله.

في bash prompt الخاص بك أو في Cloud Shell، قم بإنشاء ملف باسمcloud-init.txt وألصق التكوين التالي. على سبيل المثال، أدخل sensible-editor cloud-init.txt لإنشاء الملف ومشاهدة قائمة بالمحررين المتاحين. تأكد من نسخ ملف cloud-init بالكامل وبشكل صحيح، خاصة السطر الأول:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    defer: true
    content: |
      server {
        listen 80;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
    path: /home/azureuser/myapp/index.js
    defer: true
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

لمزيد من المعلومات حول خيارات تكوين السحابة، راجع أمثلة التكوين cloud-init .

إنشاء جهاز ظاهري

قبل أن تتمكن من إنشاء جهاز ظاهري قم بإنشاء مجموعة موارد باستخدام az group . في المثال التالي، سيتم إنشاء مجموعة موارد باسم "myResourceGroupAG" في موقع "eastus" :

az group create --name myResourceGroupAutomate --location eastus

قم بإنشاء جهاز ظاهري باستخدام az vm create. استخدم المعلمة --custom-dataلتمرير ملف التكوين الخاص بـ cloud-init. قم بتوفير المسار الكامل لتكوين cloud-init.txtإذا قمت بحفظ الملف خارج دليل العمل الحالي. ينشئ المثال التالي الجهاز الظاهري باسمmyVM:

az vm create \
    --resource-group myResourceGroupAutomate \
    --name myAutomatedVM \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init.txt

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

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

az vm open-port --port 80 --resource-group myResourceGroupAutomate --name myAutomatedVM

اختبار موقع الويب

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

عرض موقع NGINX قيد التشغيل

تصدير الشهادة من Key Vault

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

يحمي Azure Key Vault مفاتيح التشفير وبياناته السرية، مثل الشهادات أو كلمات المرور. يُساعد Key Vault على تسهيل عملية إدارة الشهادة ويُمكِّنك من الحفاظ على التحكّم في المفاتيح التي يُمكنها الوصول إلى تلك الشهادات. يقدم هذا السيناريو بعض مفاهيم Key Vault لإنشاء شهادة واستخدامها، على الرغم من أنه ليس نظرة عامة شاملة حول كيفية استخدام Key Vault.

توضح الخطوات التالية كيف يمكنك:

  • إنشاء Azure Key Vault
  • إنشاء شهادة أو تحميلها إلى Key Vault
  • قم بإنشاء مفتاح سري من الشهادة لإدخاله في جهاز ظاهري
  • إنشاء جهاز VM وتضمين الشهادة

إنشاء Azure Key Vault

أولًا، قم بإنشاء Key Vault مع إنشاء az keyvault وتمكينه للاستخدام عند نشر جهاز ظاهري. يتطلّب كل Key Vault اسمًا فريدًا، وينبغي أن يكون أحرفًا صغيرة بأكمله. استبدل mykeyvault في المثال التالي باسم Key Vault الفريد الخاص بك:

keyvault_name=mykeyvault
az keyvault create \
    --resource-group myResourceGroupAutomate \
    --name $keyvault_name \
    --enabled-for-deployment

إنشاء شهادة والتخزين في Key Vault

لأغراض استخدام الإنتاج، يجب عليك استيراد شهادة صالحة مُوقَّعة من قِبَل موفّر موثوق به باستخدام "Import-AzKeyVaultCertificate". بالنسبة لهذا البرنامج التعليمي، يوضّح المثال التالي كيف يُمكنك إنشاء شهادة موقعة ذاتيًّا باستخدام "Add-AzKeyVaultCertificate" الذي يستخدم سياسة المصادقة الافتراضية:

az keyvault certificate create \
    --vault-name $keyvault_name \
    --name mycert \
    --policy "$(az keyvault certificate get-default-policy --output json)"

إعداد الشهادة للاستخدام مع الجهاز الظاهري

لاستخدام الشهادة أثناء عملية إنشاء الجهاز الظاهري، احصل على معرف شهادتك باستخدام إصدارات القائمة السرية من az keyvault. يحتاج الجهاز الظاهري إلى الشهادة بتنسيق معين لإدخالها في التمهيد، لذا قم بتحويل الشهادة بتنسيق az vm secre. يقوم المثال التالي بتعيين إخراج هذه الأوامر للمتغيرات لسهولة الاستخدام في الخطوات التالية:

secret=$(az keyvault secret list-versions \
          --vault-name $keyvault_name \
          --name mycert \
          --query "[?attributes.enabled].id" --output tsv)
vm_secret=$(az vm secret format --secret "$secret" --output json)

إنشاء تكوين cloud-init لتأمين NGINX

عند إنشاء جهاز افتراضي، يتم تخزين الشهادات والمفاتيح في الدليل المحمي /var/lib/waagent/ . لأتمتة إضافة الشهادة إلى الجهاز الظاهري وتكوين NGINX، يمكنك استخدام تهيئة سحابة محدثة من المثال السابق.

قم بإنشاء ملف يسمىcloud-init-secured.txtوألصق التكوين التالي. إذا كنت تستخدم Cloud Shell، فقم بإنشاء ملف تهيئة cloud-init وليس على جهازك المحلي. على سبيل المثال، أدخل sensible-editor cloud-init-secured.txt لإنشاء الملف ومشاهدة قائمة بالمحررين المتاحين. تأكد من نسخ ملف cloud-init بالكامل وبشكل صحيح، خاصة السطر الأول:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    defer: true
    content: |
      server {
        listen 80;
        listen 443 ssl;
        ssl_certificate /etc/nginx/ssl/mycert.cert;
        ssl_certificate_key /etc/nginx/ssl/mycert.prv;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
    path: /home/azureuser/myapp/index.js
    defer: true
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - secretsname=$(find /var/lib/waagent/ -name "*.prv" | cut -c -57)
  - mkdir /etc/nginx/ssl
  - cp $secretsname.crt /etc/nginx/ssl/mycert.cert
  - cp $secretsname.prv /etc/nginx/ssl/mycert.prv
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

إنشاء جهاز ظاهري آمن

قم بإنشاء جهاز ظاهري باستخدام az vm create. يتم إدخال بيانات الشهادة من Key Vault مع المعلمة --secrets. كما في المثال السابق، يمكنك أيضًا تمرير تهيئة cloud-init --custom-dataبالمعلمة:

az vm create \
    --resource-group myResourceGroupAutomate \
    --name myVMWithCerts \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-secured.txt \
    --secrets "$vm_secret"

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

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

az vm open-port \
    --resource-group myResourceGroupAutomate \
    --name myVMWithCerts \
    --port 443

اختبار تطبيق الويب الآمن

والآن يُمكنك فتح مستعرض الويب وإدخال https://<publicIpAddress> في شريط العناوين. قم بتوفير عنوان IP العام الخاص بك كما هو موضح في إخراج عملية إنشاء الجهاز الظاهري السابقة. قبول تحذير الأمان إذا استخدمت شهادة موقعة ذاتيًّا:

قبول تحذير أمان مستعرض ويب

يتم بعد ذلك عرض موقع NGINX الآمن وتطبيق Node.js كما في المثال التالي:

عرض موقع NGINX الآمن قيد التشغيل

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

في هذا البرنامج التعليمي، قمت بتكوين أجهزة ظاهرية عند التمهيد الأول باستخدام cloud-init. تعلمت كيفية القيام بالتالي:

  • إنشاء ملف تهيئة cloud-init
  • إنشاء جهاز ظاهري يستخدم ملف cloud-init
  • عرض تطبيق Node.js قيد التشغيل بعد إنشاء الجهاز الظاهري
  • استخدم Key Vault لتخزين الشهادات بأمان
  • أتمتة عمليات النشر الآمنة لـ NGINX باستخدام cloud-init

انتقل إلى البرنامج التعليمي التالي لمعرفة كيفية إنشاء صور مخصصة للجهاز الظاهري.