استخدام الإصدار 2 من ملحق البرنامج النصي المخصص مع الأجهزة الظاهرية التي تعمل بنظام Linux

تنبيه

تشير هذه المقالة إلى CentOS، وهو توزيع Linux يقترب من حالة نهاية العمر الافتراضي (EOL). يرجى مراعاة استخدامك والتخطيط وفقا لذلك. لمزيد من المعلومات، راجع إرشادات نهاية العمر الافتراضي CentOS.

ينزِّل الإصدار 2 من ملحق البرنامج النصي المخصص البرامج النصية ويشغلها على أجهزة Azure الظاهرية (VMs). استخدم هذا الملحق لتكوين ما بعد التوزيع أو تثبيت البرامج أو أي مهمة تكوين أو إدارة أخرى. يمكنك تنزيل البرامج النصية من تخزين Azure أو موقع إنترنت آخر يمكن الوصول إليه، أو يمكنك توفيرها لوقت تشغيل الملحق.

يتكامل ملحق البرنامج النصي المخصص مع قوالب Azure Resource Manager. يمكنك أيضا تشغيله باستخدام Azure CLI أو Azure PowerShell أو واجهة برمجة تطبيقات REST للأجهزة الظاهرية Azure.

توضح هذه المقالة كيفية استخدام ملحق البرنامج النصي المخصص من Azure CLI، وكيفية تشغيل الملحق باستخدام قالب Azure Resource Manager. توفر هذه المقالة أيضاً خطوات استكشاف الأخطاء وإصلاحها لأنظمة Linux.

هناك إصداران من ملحق البرنامج النصي المخصص:

  • الإصدار 1: Microsoft.OSTCExtensions.CustomScriptForLinux
  • الإصدار 2: Microsoft.Azure.Extensions.CustomScript

استخدم الإصدار 2 للنشرات الجديدة والحالية. الإصدار الجديد هو بديل منسدل. الترحيل سهل مثل تغيير الاسم والإصدار. لست بحاجة إلى تغيير تهيئة الملحق.

المتطلبات الأساسية

توزيعات لينكس المدعومة

التوزيع x64 ARM64
Alma Linux 9.x+ 9.x+
CentOS 7.x+، 8.x+ 7.x+
Debian 10+ 11.x+
Flatcar Linux 3374.2.x+ 3374.2.x+
Azure Linux 2.x 2.x
openSUSE 12.3+ غير معتمد
Oracle Linux 6.4+، 7.x+، 8.x+ غير معتمد
Red Hat Enterprise Linux 6.7+، 7.x+، 8.x+، 9.x+ 8.6+، 9.x+
Rocky Linux 9.x+ 9.x+
SLES 12.x+، 15.x+ 15.x SP4+
Ubuntu 18.04+, 20.04+, 22.04+ 20.04+, 22.04+

موقع البرنامج النصي

يمكنك تعيين الملحق لاستخدام بيانات اعتماد Azure Blob Storage بحيث يمكنه الوصول إلى Azure Blob Storage. يمكن أن يكون موقع البرنامج النصي في أي مكان، طالما يمكن توجيه الجهاز الظاهري إلى نقطة النهاية هذه، على سبيل المثال، GitHub أو خادم ملفات داخلي.

الاتصال بالإنترنت

لتنزيل برنامج نصي خارجيا، مثل من GitHub أو Azure Storage، تحتاج إلى فتح منافذ جدار حماية أو مجموعة أمان شبكة (NSG) أخرى. على سبيل المثال، إذا كان برنامجك النصي موجوداً في Azure Storage، فيمكنك السماح بالوصول باستخدام علامات خدمة Azure NSG للتخزين.

إذا كان البرنامج النصي الخاص بك على خادم محلي، فقد لا تزال بحاجة إلى فتح جدار حماية آخر أو منافذ NSG.

تلميحات

  • يرجع أعلى معدل فشل لهذا الملحق إلى أخطاء بناء الجملة في البرنامج النصي. تحقق من تشغيل البرنامج النصي دون أخطاء. ضع المزيد من تسجيل الدخول إلى البرنامج النصي لتسهيل العثور على حالات الفشل.
  • كتابة البرامج النصية غير المتكررة، بحيث لا يؤدي تشغيلها أكثر من مرة عن طريق الخطأ إلى تغييرات في النظام.
  • تأكد من أن البرامج النصية لا تتطلب إدخال المستخدم عند تشغيلها.
  • يُسمح للبرنامج النصي بـ 90 دقيقة للتشغيل. أي شيء أطول يؤدي إلى فشل توفير الملحق.
  • لا تضع عمليات إعادة التشغيل داخل البرنامج النصي. تؤدي إعادة التشغيل إلى حدوث مشاكل مع الملحقات الأخرى التي يتم تثبيتها، ولا يستمر الملحق بعد إعادة التشغيل.
  • إذا كان لديك برنامج نصي يتسبب في إعادة التشغيل قبل تثبيت التطبيقات وتشغيل البرامج النصية، فقم بجدولة إعادة التشغيل باستخدام مهمة cron أو باستخدام أدوات مثل ملحقات DSC أو Chef أو Puppet.
  • لا تقم بتشغيل برنامج نصي يتسبب في إيقاف أو تحديث عامل Azure Linux. قد يترك الملحق في حالة انتقال ويؤدي إلى انتهاء المهلة.
  • يقوم الملحق بتشغيل برنامج نصي مرة واحدة فقط. إذا كنت ترغب في تشغيل برنامج نصي عند كل بداية تشغيل، فيمكنك استخدام صورة تهيئة سحابية واستخدام وحدة Scripts Per Boot. بدلاً من ذلك، يمكنك استخدام البرنامج النصي لإنشاء وحدة خدمة systemd.
  • يمكنك تطبيق إصدار واحد فقط من الملحق على الجهاز الظاهري. لتشغيل برنامج نصي مخصص ثان، قم بتحديث الملحق الموجود بتكوين جديد. بدلا من ذلك، يمكنك إزالة ملحق البرنامج النصي المخصص وإعادة تطبيقه باستخدام البرنامج النصي المحدث.
  • إذا كنت تريد جدولة وقت تشغيل برنامج نصي، فاستخدم الملحق لإنشاء مهمة cron.
  • عند تشغيل البرنامج النصي، لا ترى سوى حالة ملحق انتقال من مدخل Microsoft Azure أو CLI. إذا كنت تريد تحديثات حالة أكثر تكرارا لبرنامج نصي قيد التشغيل، فقم بإنشاء الحل الخاص بك.
  • لا يدعم ملحق البرنامج النصي المخصص أصلاً الخوادم الوكيلة. ومع ذلك، يمكنك استخدام أداة نقل الملفات، مثل Curl، التي تدعم خوادم الوكيل داخل البرنامج النصي الخاص بك.
  • كن على علم بمواقع الدليل غير الافتراضية التي قد تعتمد عليها البرامج النصية أو الأوامر. لديك منطق للتعامل مع هذا الموقف.

مخطط الملحق

يحدد تكوين ملحق البرنامج النصي المخصص أشياء مثل موقع البرنامج النصي والأمر المراد تشغيله. يمكنك تخزين هذه المعلومات في ملفات التكوين، أو تحديده في سطر الأوامر، أو تحديده في قالب Azure Resource Manager.

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

{
  "name": "config-app",
  "type": "Extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2019-03-01",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "skipDos2Unix":false,
      "timestamp":123456789
    },
    "protectedSettings": {
       "commandToExecute": "<command-to-execute>",
       "script": "<base64-script-to-execute>",
       "storageAccountName": "<storage-account-name>",
       "storageAccountKey": "<storage-account-key>",
       "fileUris": ["https://.."],
       "managedIdentity" : "<managed-identity-identifier>"
    }
  }
}

إشعار

الخاصية managedIdentity لا يجب أن تُستخدم بالاقتران مع الخاصية storageAccountName أو storageAccountKey.

قيم Property

الاسم قيمة أو مثال نوع البيانات
apiVersion 2019-03-01 date
publisher Microsoft.Azure.Extensions سلسلة
النوع CustomScript سلسلة
typeHandlerVersion 2.1 العدد الصحيح
fileUris https://github.com/MyProject/Archive/MyPythonScript.py صفيف
commandToExecute python MyPythonScript.py \<my-param1> سلسلة
البرنامج النصي IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo= سلسلة
skipDos2Unix false boolean
الطابع الزمني 123456789 عدد صحيح بحجم 32 بت
storageAccountName examplestorageacct سلسلة
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== سلسلة
الهوية المُدارة { } أو { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" } أو { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } كائن JSON

تفاصيل قيمة الخاصية

الخاصية اختياري أم مطلوب التفاصيل
apiVersion غير قابل للتطبيق يمكنك العثور على أحدث إصدار من واجهة برمجة التطبيقات باستخدام مستكشف الموارد أو باستخدام الأمر az provider list -o json الموجود في Azure CLI.
fileUris اختياري عناوين URL للملفات المراد تنزيلها.
commandToExecute مطلوب إذا كان script لم يتم تعيينه البرنامج النصي لنقطة الإدخال المراد تشغيله. استخدم هذه الخاصية بدلاً من script إذا كان الأمر خاصتك يحتوي على بيانات سرية مثل كلمات المرور.
البرنامج النصي مطلوب إذا كان commandToExecute لم يتم تعيينه برنامج نصي بترميز Base64 واختياريا gzip'ed يتم تشغيله بواسطة /bin/sh.
skipDos2Unix اختياري باشر بتعيين هذه القيمة إلى false إذا كنت تريد تخطي تحويل dos2unix لعناوين URL للملفات المستندة إلى البرنامج النصي أو البرامج النصية.
الطابع الزمني اختياري باشر بتغيير هذه القيمة فقط لتشغيل إعادة تشغيل البرنامج النصي. أي قيمة صحيحة مقبولة، طالما أنها تختلف عن القيمة السابقة.
storageAccountName اختياري اسم حساب التخزين خاصتك. إذا حددت بيانات اعتماد التخزين، فيجب أن تكون جميع القيم fileUris عناوين URL لكائنات Azure الثنائية كبيرة الحجم.
storageAccountKey اختياري مفتاح الوصول لحساب التخزين.
الهوية المُدارة اختياري الهوية المدارة لتنزيل الملفات. القيم هي clientId (اختياري، سلسلة)، وهو معرف العميل للهوية المدارة، و objectId (اختياري، سلسلة)، وهو معرف الكائن للهوية المدارة.

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

قد يكون استخدام الإعدادات العامة مفيداً لتصحيح الأخطاء، ولكننا نوصي بشدة باستخدام الإعدادات المحمية.

يمكنك تعيين القيم التالية إما في الإعدادات العامة أو المحمية. يرفض الملحق أي تكوين حيث يتم تعيين هذه القيم في كل من الإعدادات العامة والمحمية.

  • commandToExecute
  • script
  • fileUris

الخاصية: skipDos2Unix

الإصدار السابق من ملحق البرنامج النصي المخصص، ، Microsoft.OSTCExtensions.CustomScriptForLinuxيحول تلقائيا ملفات DOS إلى ملفات UNIX عن طريق الترجمة \r\n إلى \n. لا تزال هذه الترجمة موجودة وهي قيد التشغيل بشكل افتراضي. يُطبَّق هذا التحويل على جميع الملفات التي تم تنزيلها من fileUris أو إعداد البرنامج النصي استناداً إلى أي من المعايير التالية:

  • الملحق هو .sh أو .txt أو .py أو .pl. يتطابق إعداد البرنامج النصي دائما مع هذا المعيار لأنه يفترض أنه تشغيل برنامج نصي مع /bin/sh. يتم حفظ إعداد البرنامج النصي ك script.sh على الجهاز الظاهري.
  • يبدأ الملف بـ #!.

القيمة الافتراضية هي false، مما يعني أن تحويل dos2unixيتم تنفيذه. يمكنك تخطي تحويل dos2unix عن طريق إعداد skipDos2Unix إلى true:

{
  "fileUris": ["<url>"],
  "commandToExecute": "<command-to-execute>",
  "skipDos2Unix": true
}

الخاصية: برنامج نصي

يدعم ملحق البرنامج النصي المخصص تنفيذ برنامج نصي معرف بواسطة المستخدم. إعدادات البرنامج النصي تدمج commandToExecute و fileUris في إعدادٍ واحدٍ. بدلا من الاضطرار إلى إعداد ملف للتنزيل من Azure Storage أو gist GitHub، يمكنك ترميز البرنامج النصي كإعداد. يمكنك استخدام البرنامج النصي لاستبدال commandToExecute و fileUris.

فيما يلي بعض المتطلبات:

  • البرنامج النصي يجب أن يكون مشفراً باستخدام Base64.
  • يمكن أن يكون البرنامج النصي مشفراً اختيارياً بصيغة gzip'ed.
  • يمكنك استخدام إعداد البرنامج النصي في الإعدادات العامة أو المحمية.
  • الحد الأقصى لحجم بيانات معلمة البرنامج النصي هو 256 كيلوبايت. إذا تجاوز البرنامج النصي هذا الحجم، فلن يتم تشغيله.

على سبيل المثال، يُحفظ البرنامج النصي التالي إلى الملف /script.sh/:

#!/bin/sh
echo "Creating directories ..."
mkdir /data
chown user:user /data
mkdir /appdata
chown user:user /appdata

يمكنك إنشاء إعداد البرنامج النصي "ملحق البرنامج النصي المخصص" الصحيح عن طريق أخذ إخراج الأمر التالي:

cat script.sh | base64 -w0
{
  "script": "IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo="
}

في معظم الحالات، يمكن تشفير البرنامج النصي اختيارياً بصيغة gzip'ed لتقليل الحجم أكثر. يكتشف ملحق البرنامج النصي المخصص تلقائياً استخدام ضغط gzip.

cat script | gzip -9 | base64 -w 0

يستخدم ملحق البرنامج النصي المخصص الخوارزمية التالية لتشغيل برنامج نصي:

  1. تأكد من أن طول قيمة البرنامج النصي لا يتجاوز 256 كيلوبايت.
  2. يفك Base64 تشفير قيمة البرنامج النصي.
  3. حاول الضغط على القيمة التي تم فك تشفيرها بواسطة Base64.
  4. اكتب القيمة التي تم فك ترميزها وفك ضغطها اختياريا إلى القرص: /var/lib/waagent/custom-script/#/script.sh.
  5. شغَّل البرنامج النصي باستخدام _/bin/sh -c /var/lib/waagent/custom-script/#/script.sh.

العقار: managedIdentity

إشعار

هذه الخاصية يجب أن تُحدَّد في الإعدادات المحمية فقط.

يدعم ملحق البرنامج النصي المخصص، الإصدار 2.1 والإصدارات الأحدث، الهويات المدارة لتنزيل الملفات من عناوين URL المتوفرة fileUris في الإعداد. يسمح هذا الأسلوب لملحق البرنامج النصي المخصص بالوصول إلى الكائنات الثنائية كبيرة الحجم الخاصة ل Azure Storage أو الحاويات دون أن يضطر المستخدم إلى تمرير الأسرار مثل الرموز المميزة لتوقيع الوصول المشترك (SAS) أو مفاتيح حساب التخزين.

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

لاستخدام الهوية المعينة من قبل النظام على الجهاز الظاهري الهدف أو مجموعة مقياس الجهاز الظاهري، قم بتعيين managedidentity إلى كائن JSON فارغ.

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : {}
}

لاستخدام الهوية المعينة من قبل المستخدم على الجهاز الظاهري الهدف أو مجموعة مقياس الجهاز الظاهري، قم بالتكوين managedidentity باستخدام معرف العميل أو معرف الكائن للهوية المدارة.

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" }
}
{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" }
}

إشعار

الخاصية managedIdentity لا يجب أن تُستخدم بالاقتران مع الخاصية storageAccountName أو storageAccountKey.

توزيع قالب

يمكنك توزيع ملحقات جهاز Azure الظاهري باستخدام قوالب Azure Resource Manager. يمكن استخدام مخطط JSON المفصل في القسم السابق في قالب Azure Resource Manager لتشغيل ملحق البرنامج النصي المخصص أثناء توزيع القالب. يمكنك العثور على نموذج قالب يتضمن ملحق البرنامج النصي المخصص على GitHub.

{
  "name": "config-app",
  "type": "extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2019-03-01",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      },
    "protectedSettings": {
      "commandToExecute": "sh hello.sh <param2>",
      "fileUris": ["https://github.com/MyProject/Archive/hello.sh"
      ]
    }
  }
}

إشعار

أسماء خصائص JSON حساسة في حالة الأحرف. لتجنب مشاكل النشر، استخدم الأسماء كما هو موضح هنا.

Azure CLI

عند استخدام Azure CLI لتشغيل ملحق البرنامج النصي المخصص، قم بإنشاء ملف تكوين أو ملفات. كحد أدنى، يجب أن يحتوي ملف التكوين على commandToExecute. az vm extension set يشير الأمر إلى ملف التكوين:

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --protected-settings ./script-config.json

بدلا من ذلك، يمكنك تحديد الإعدادات في الأمر كسلسلة بتنسيق JSON. يسمح هذا الأسلوب بتحديد التكوين أثناء التنفيذ وبدون ملف تكوين منفصل.

az vm extension set \
  --resource-group exttest \
  --vm-name exttest \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --protected-settings '{"fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],"commandToExecute": "./config-music.sh"}'

مثال: التكوين العام باستخدام ملف البرنامج النصي

يستخدم هذا المثال ملف البرنامج النصي التالي المسمى script-config.json:

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],
  "commandToExecute": "./config-music.sh"
}
  1. أنشئ ملف البرنامج النصي باستخدام محرر النص الذي تختاره أو باستخدام أمر CLI التالي:

    cat <<EOF > script-config.json
    {
      "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  2. شغّل الأمر التالي:

    az vm extension set \
      --resource-group myResourceGroup \
      --vm-name myVM --name customScript \
      --publisher Microsoft.Azure.Extensions \
      --settings ./script-config.json
    

مثال: التكوين العام دون استخدام ملف البرنامج النصي

يستخدم هذا المثال المحتوى التالي بتنسيق JSON:

{
  "commandToExecute": "apt-get -y update && apt-get install -y apache2"
}

شغّل الأمر التالي:

az vm extension set \
  --resource-group tim0329vmRG \
  --vm-name tim0329vm --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"commandToExecute": "apt-get -y update && apt-get install -y apache2"}'

مثال: ملفات التكوين العامة والمحمية

استخدم ملف تكوين عام لتحديد URI لملف البرنامج النصي:

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"]
}

استخدم ملف تكوين محمي لتحديد الأمر الذي سيتم تشغيله:

{
  "commandToExecute": "./config-music.sh"
}
  1. أنشئ ملف التكوين العام باستخدام محرر النص الذي تختاره أو باستخدام أمر CLI التالي:

    cat <<EOF > script-config.json
    {
      "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"]
    }
    EOF
    
  2. أنشئ ملف التكوين المحمي باستخدام محرر النص الذي تختاره أو باستخدام أمر CLI التالي:

    cat <<EOF > protected-config.json
    {
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  3. شغّل الأمر التالي:

    az vm extension set \
      --resource-group myResourceGroup \
      --vm-name myVM \
      --name customScript \
      --publisher Microsoft.Azure.Extensions \
      --settings ./script-config.json \
      --protected-settings ./protected-config.json
    

مجموعات توسيع الجهاز الظاهري

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

نوصي باستخدام PowerShell أو Azure CLI أو قالب Azure Resource Manager عند نشر ملحق البرنامج النصي المخصص على مجموعة مقياس الجهاز الظاهري. وبهذه الطريقة، يمكنك اختيار استخدام هوية مدارة أو التحكم المباشر في انتهاء صلاحية الرمز المميز SAS للوصول إلى البرنامج النصي في حساب التخزين الخاص بك طالما احتجت إلى ذلك.

استكشاف الأخطاء وإصلاحها

عند تشغيل ملحق البرنامج النصي المخصص، يتم إنشاء البرنامج النصي أو تنزيله في دليل مشابه للمثال التالي. يتم أيضا حفظ إخراج الأوامر في هذا الدليل والملفات stdout و stderr.

sudo ls -l /var/lib/waagent/custom-script/download/0/

لاستكشاف الأخطاء وإصلاحها، تحقق أولا من سجل عامل Linux وتأكد من تشغيل الملحق:

sudo cat /var/log/waagent.log

ابحث عن تنفيذ الملحق. يبدو شيئا مثل:

2018/04/26 17:47:22.110231 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] [Enable] current handler state is: notinstalled
2018/04/26 17:47:22.306407 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Download, message=Download succeeded, duration=167
2018/04/26 17:47:22.339958 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Initialize extension directory
2018/04/26 17:47:22.368293 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Update settings file: 0.settings
2018/04/26 17:47:22.394482 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Install extension [bin/custom-script-shim install]
2018/04/26 17:47:23.432774 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Install, message=Launch command succeeded: bin/custom-script-shim install, duration=1007
2018/04/26 17:47:23.476151 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Enable extension [bin/custom-script-shim enable]
2018/04/26 17:47:24.516444 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Enable, message=Launch command succeeded: bin/custom-sc

في الإخراج السابق:

  • Enable عندما يبدأ تشغيل الأمر.
  • Download يتعلق بتنزيل حزمة ملحق البرنامج النصي المخصص من Azure، وليس ملفات البرنامج النصي المحددة في fileUris.

ينتج ملحق Azure Script سجلاً، والذي يمكنك العثور عليه هنا:

sudo cat /var/log/azure/custom-script/handler.log

ابحث عن التنفيذ الفردي. يبدو شيئا مثل:

time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=start
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=pre-check
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="comparing seqnum" path=mrseq
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="seqnum saved" path=mrseq
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="reading configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="read configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validating json schema"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="json schema valid"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="parsing configuration json"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="parsed configuration json"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validating configuration logically"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validated configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="creating output directory" path=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="created output directory"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 files=1
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 file=0 event="download start"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 file=0 event="download complete" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executing command" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executing protected commandToExecute" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executed command" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=enabled
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=end

هنا يمكنك رؤية:

  • الأمر enable الذي يبدأ تشغيل هذا السجل.
  • تم تمرير الإعدادات إلى الملحق.
  • الملحق الذي يقوم بتنزيل الملف ونتيجة هذا الإجراء.
  • الأمر قيد التشغيل والنتيجة.

يمكنك أيضاً استرداد حالة تنفيذ ملحق البرنامج النصي المخصص، بما في ذلك الوسيطات الفعلية التي تم تمريرها كـ commandToExecute، باستخدام Azure CLI:

az vm extension list -g myResourceGroup --vm-name myVM

يبدو الإخراج مثل النص التالي:

[
  {
    "autoUpgradeMinorVersion": true,
    "forceUpdateTag": null,
    "id": "/subscriptions/subscriptionid/resourceGroups/rgname/providers/Microsoft.Compute/virtualMachines/vmname/extensions/customscript",
    "resourceGroup": "rgname",
    "settings": {
      "commandToExecute": "sh script.sh > ",
      "fileUris": [
        "https://catalogartifact.azureedge.net/publicartifacts/scripts/script.sh",
        "https://catalogartifact.azureedge.net/publicartifacts/scripts/script.sh"
      ]
    },
    "tags": null,
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "typeHandlerVersion": "2.0",
    "virtualMachineExtensionType": "CustomScript"
  },
  {
    "autoUpgradeMinorVersion": true,
    "forceUpdateTag": null,
    "id": "/subscriptions/subscriptionid/resourceGroups/rgname/providers/Microsoft.Compute/virtualMachines/vmname/extensions/OmsAgentForLinux",
    "instanceView": null,
    "location": "eastus",
    "name": "OmsAgentForLinux",
    "protectedSettings": null,
    "provisioningState": "Succeeded",
    "publisher": "Microsoft.EnterpriseCloud.Monitoring",
    "resourceGroup": "rgname",
    "settings": {
      "workspaceId": "workspaceid"
    },
    "tags": null,
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "typeHandlerVersion": "1.0",
    "virtualMachineExtensionType": "OmsAgentForLinux"
  }
]

مشكلات بناء جملة Azure CLI

يمكن تشغيل Azure CLI في عِدة بيئات shell، ولكن مع تباينات بسيطة في التنسيق. إذا كانت لديك نتائج غير متوقعة مع أوامر Azure CLI، فراجع كيفية استخدام Azure CLI بنجاح.

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

لمشاهدة التعليمات البرمجية والمشكلات الحالية والإصدارات، راجع custom-script-extension-linux.