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

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

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

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

هناك نوعان من ملحقات البرنامج النصي المخصص لنظام التشغيل Linux:

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

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

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

نظام التشغيل

سيتم تشغيل ملحق البرنامج النصي المخصص لـ Linux على أنظمة التشغيل المدعومة. لمزيد من المعلومات، راجع عمليات توزيع Linux المعتمدة على Azure.

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

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

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

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

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

النصائح والأساليب

  • يرجع أعلى معدل فشل لهذا الملحق إلى أخطاء بناء الجملة في البرنامج النصي. اختبر تشغيل البرنامج النصي بدون أخطاء. ضع تسجيل دخول إضافي إلى البرنامج النصي لتسهيل العثور على حالات الفشل.
  • اكتب البرامج النصية التي تكون متماثلة، لذا فإن تشغيلها أكثر من مرة عن طريق الخطأ لن يؤدي إلى تغييرات في النظام.
  • تأكد من أن البرامج النصية لا تتطلب إدخال المستخدم عند تشغيلها.
  • يُسمح للبرنامج النصي بـ 90 دقيقة للتشغيل. أي شيء أطول سيؤدي إلى فشل توفير الملحق.
  • لا تضع عمليات إعادة التشغيل داخل البرنامج النصي. سيؤدي هذا الإجراء إلى حدوث مشكلات في الملحقات الأخرى التي يجري تثبيتها، ولن يستمر الملحق بعد إعادة التشغيل.
  • إذا كان لديك برنامج نصي سيؤدي إلى إعادة التشغيل قبل تثبيت التطبيقات وتشغيل البرامج النصية، فبادر بجدولة إعادة التشغيل باستخدام مهمة Cron أو باستخدام أدوات مثل ملحقات DSC أو Chef أو Puppet.
  • لا تشغِّل برنامجاً نصياً من شأنه أن يتسبب في إيقاف أو تحديث عامل الجهاز الظاهري. قد يترك الملحق في حالة انتقالية ويؤدي إلى انتهاء المهلة.
  • سيُشغَّل الملحق لبرنامج نصي لمرةٍ واحدةٍ فقط. إذا كنت ترغب في تشغيل برنامج نصي عند كل بداية تشغيل، فيمكنك استخدام صورة تهيئة سحابية واستخدام وحدة Scripts Per Boot. بدلاً من ذلك، يمكنك استخدام البرنامج النصي لإنشاء وحدة خدمة systemd.
  • يمكنك تطبيق إصدار واحد فقط من الملحق على الجهاز الظاهري. لتشغيل برنامج نصي مخصص ثان، يمكنك تحديث الملحق الحالي بتكوين جديد. بدلاً من ذلك، يمكنك إزالة ملحق البرنامج النصي المخصص وإعادة تطبيقه باستخدام البرنامج النصي المحدث.
  • إذا كنت تريد جدولة وقت تشغيل برنامج نصي، فاستخدم الملحق لإنشاء مهمة Cron.
  • عند تشغيل البرنامج النصي، سترى فقط حالة ملحق "انتقال" من مدخل 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 التاريخ
publisher Microsoft.Azure.Extensions سلسلة
type CustomScript سلسلة
typeHandlerVersion 2.1 int
fileUris https://github.com/MyProject/Archive/MyPythonScript.py صفيف
commandToExecute python MyPythonScript.py \<my-param1> سلسلة
script IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo= سلسلة
skipDos2Unix false منطقي
timestamp 123456789 عدد صحيح بحجم 32 بت
storageAccountName examplestorageacct سلسلة
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== سلسلة
managedIdentity { } أو { "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 إذا كان الأمر خاصتك يحتوي على بيانات سرية مثل كلمات المرور.
script مطلوب إذا كان commandToExecute لم يتم تعيينه برنامج نصي مشفر باستخدام Base64 (واختيارياً بصيغة gzip'ed) يتم تشغيله بواسطة /bin/sh.
skipDos2Unix ‏‏اختياري باشر بتعيين هذه القيمة إلى false إذا كنت تريد تخطي تحويل dos2unix لعناوين URL للملفات المستندة إلى البرنامج النصي أو البرامج النصية.
timestamp ‏‏اختياري باشر بتغيير هذه القيمة فقط لتشغيل إعادة تشغيل البرنامج النصي. أي قيمة صحيحة مقبولة، طالما أنها تختلف عن القيمة السابقة.
storageAccountName ‏‏اختياري اسم حساب التخزين خاصتك. إذا حددت بيانات اعتماد التخزين، فيجب أن تكون جميع القيم fileUris عناوين URL لكائنات Azure الثنائية كبيرة الحجم.
storageAccountKey ‏‏اختياري مفتاح الوصول لحساب التخزين.
managedIdentity ‏‏اختياري الهوية المدارة لتنزيل الملفات:

clientId (اختياري، سلسلة): معرف العميل للهوية المدارة.

objectId (اختياري، سلسلة): معرف العميل للهوية المدارة.

يمكنك تعيين القيم التالية إما في الإعدادات العامة أو المحمية. سيرفض الملحق أي تكوين تُعيَّن فيه هذه القيم في كلٍ من الإعدادات العامة والمحمية.

  • commandToExecute
  • script
  • fileUris

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

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

الخاصية: skipDos2Unix

القيمة الافتراضية هي false، مما يعني أن تحويل dos2unixيتم تنفيذه.

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

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

يمكنك تخطي تحويل dos2unix عن طريق إعداد skipDos2Unix إلى true:

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

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

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

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

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

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

#!/bin/sh
echo "Updating packages ..."
apt update
apt upgrade -y

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

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

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

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

أمر Azure CLI:

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

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

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

أمر Azure CLI:

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

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

يمكنك استخدام ملف تكوين عام لتحديد عنوان URI الخاص بملف البرنامج النصي. يمكنك استخدام ملف تكوين محمي لتحديد الأمر المراد تشغيله.

ملف التكوين العام:

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

ملف التكوين المحمي:

{
  "commandToExecute": "./config-music.sh <param1>"
}

أمر Azure CLI:

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

مجموعات قياس الآلات الافتراضية

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

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

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

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

/var/lib/waagent/custom-script/download/0/

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

/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 سجلاً، والذي يمكنك العثور عليه هنا:

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

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

للاطلاع على التعليمات البرمجية والمشكلات الحالية والإصدارات، انتقل إلى مستودع custom-script-extension-linux على GitHub.