⁧⁩الأجهزة الظاهرية في قالب Azure Resource Manager⁧⁩

ينطبق على: ✔️ أجهزة Windows الظاهرية

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

هناك العديد من القوالب في المعرض التي تتضمن مورد الجهاز الظاهري. لا يتم وصف جميع العناصر التي يمكن تضمينها في قالب هنا.

يوضح هذا المثال مقطع مورد نموذجي من قالب لإنشاء عدد محدد من الأجهزة الظاهرية:

"resources": [
  {
    "apiVersion": "2016-04-30-preview",
    "type": "Microsoft.Compute/virtualMachines",
    "name": "[concat('myVM', copyindex())]",
    "location": "[resourceGroup().location]",
    "copy": {
      "name": "virtualMachineLoop",
      "count": "[parameters('numberOfInstances')]"
    },
    "dependsOn": [
      "[concat('Microsoft.Network/networkInterfaces/myNIC', copyindex())]"
    ],
    "properties": {
      "hardwareProfile": {
        "vmSize": "Standard_DS1"
      },
      "osProfile": {
        "computername": "[concat('myVM', copyindex())]",
        "adminUsername": "[parameters('adminUsername')]",
        "adminPassword": "[parameters('adminPassword')]"
      },
      "storageProfile": {
        "imageReference": {
          "publisher": "MicrosoftWindowsServer",
          "offer": "WindowsServer",
          "sku": "2012-R2-Datacenter",
          "version": "latest"
        },
        "osDisk": {
          "name": "[concat('myOSDisk', copyindex())]",
          "caching": "ReadWrite",
          "createOption": "FromImage"
        },
        "dataDisks": [
          {
            "name": "[concat('myDataDisk', copyindex())]",
            "diskSizeGB": "100",
            "lun": 0,
            "createOption": "Empty"
          }
        ]
      },
      "networkProfile": {
        "networkInterfaces": [
          {
            "id": "[resourceId('Microsoft.Network/networkInterfaces',
              concat('myNIC', copyindex()))]"
          }
        ]
      },
      "diagnosticsProfile": {
        "bootDiagnostics": {
          "enabled": "true",
          "storageUri": "[concat('https://', variables('storageName'), '.blob.core.windows.net')]"
        }
      }
    },
    "resources": [
      {
        "name": "Microsoft.Insights.VMDiagnosticsSettings",
        "type": "extensions",
        "location": "[resourceGroup().location]",
        "apiVersion": "2016-03-30",
        "dependsOn": [
          "[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
        ],
        "properties": {
          "publisher": "Microsoft.Azure.Diagnostics",
          "type": "IaaSDiagnostics",
          "typeHandlerVersion": "1.5",
          "autoUpgradeMinorVersion": true,
          "settings": {
            "xmlCfg": "[base64(concat(variables('wadcfgxstart'),
            variables('wadmetricsresourceid'),
            concat('myVM', copyindex()),
            variables('wadcfgxend')))]",
            "storageAccount": "[variables('storageName')]"
          },
          "protectedSettings": {
            "storageAccountName": "[variables('storageName')]",
            "storageAccountKey": "[listkeys(variables('accountid'),
              '2015-06-15').key1]",
            "storageAccountEndPoint": "https://core.windows.net"
          }
        }
      },
      {
        "name": "MyCustomScriptExtension",
        "type": "extensions",
        "apiVersion": "2016-03-30",
        "location": "[resourceGroup().location]",
        "dependsOn": [
          "[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
        ],
        "properties": {
          "publisher": "Microsoft.Compute",
          "type": "CustomScriptExtension",
          "typeHandlerVersion": "1.7",
          "autoUpgradeMinorVersion": true,
          "settings": {
            "fileUris": [
              "[concat('https://', variables('storageName'),
                '.blob.core.windows.net/customscripts/start.ps1')]"
            ],
            "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File start.ps1"
          }
        }
      }
    ]
  }
]

ملاحظة

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

إصدار API

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

"apiVersion": "2016-04-30-preview",

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

استخدم هذه الفرص للحصول على أحدث إصدارات واجهة برمجة التطبيقات:

المعلمات والمتغيرات

تسهل المعلمات عليك تحديد قيم للقالب عند تشغيله. يتم استخدام قسم المعلمات هذا في المثال:

"parameters": {
  "adminUsername": { "type": "string" },
  "adminPassword": { "type": "securestring" },
  "numberOfInstances": { "type": "int" }
},

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

تسهل عليك المتغيرات إعداد قيم في القالب يتم استخدامها بشكل متكرر من خلاله أو التي يمكن أن تتغير بمرور الوقت. يستخدم قسم المتغيرات هذا في المثال:

"variables": {
  "storageName": "mystore1",
  "accountid": "[concat('/subscriptions/', subscription().subscriptionId,
    '/resourceGroups/', resourceGroup().name,
  '/providers/','Microsoft.Storage/storageAccounts/', variables('storageName'))]",
  "wadlogs": "<WadCfg>
    <DiagnosticMonitorConfiguration overallQuotaInMB=\"4096\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration\">
      <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter=\"Error\"/>
      <WindowsEventLog scheduledTransferPeriod=\"PT1M\" >
        <DataSource name=\"Application!*[System[(Level = 1 or Level = 2)]]\" />
        <DataSource name=\"Security!*[System[(Level = 1 or Level = 2)]]\" />
        <DataSource name=\"System!*[System[(Level = 1 or Level = 2)]]\" />
      </WindowsEventLog>",
  "wadperfcounters": "<PerformanceCounters scheduledTransferPeriod=\"PT1M\">
      <PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Thread Count\" sampleRate=\"PT15S\" unit=\"Count\">
        <annotation displayName=\"Threads\" locale=\"en-us\"/>
      </PerformanceCounterConfiguration>
    </PerformanceCounters>",
  "wadcfgxstart": "[concat(variables('wadlogs'), variables('wadperfcounters'),
    '<Metrics resourceId=\"')]",
  "wadmetricsresourceid": "[concat('/subscriptions/', subscription().subscriptionId,
    '/resourceGroups/', resourceGroup().name ,
    '/providers/', 'Microsoft.Compute/virtualMachines/')]",
  "wadcfgxend": "\"><MetricAggregation scheduledTransferPeriod=\"PT1H\"/>
    <MetricAggregation scheduledTransferPeriod=\"PT1M\"/>
    </Metrics></DiagnosticMonitorConfiguration>
    </WadCfg>"
},

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

عمليات التكرار الحلقي للموارد

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

"copy": {
  "name": "virtualMachineLoop",
  "count": "[parameters('numberOfInstances')]"
},

لاحظ أيضاً في المثال أنه يتم استخدام فهرس التكرار الحلقي عند تحديد بعض القيم للمورد. على سبيل المثال، إذا قمت بإدخال عدد مثيل من ثلاثة، أسماء أقراص نظام التشغيل هي myOSDisk1 وmyOSDisk2 وmyOSDisk3:

"osDisk": {
  "name": "[concat('myOSDisk', copyindex())]",
  "caching": "ReadWrite",
  "createOption": "FromImage"
}

ملاحظة

يستخدم هذا المثال الأقراص المدارة للأجهزة الظاهرية.

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

"networkInterfaces": [ {
  "id": "[resourceId('Microsoft.Network/networkInterfaces',
    concat('myNIC', copyindex()))]"
} ]

التبعيات

تعتمد معظم الموارد على موارد أخرى للعمل بشكل صحيح. يجب أن تكون الأجهزة الظاهرية مرتبطة بشبكة ظاهرية وللقيام بذلك تحتاج إلى واجهة شبكة. يتم استخدام عنصر dependsOn للتأكد من أن واجهة الشبكة جاهزة للاستخدام قبل إنشاء الأجهزة الظاهرية:

"dependsOn": [
  "[concat('Microsoft.Network/networkInterfaces/', 'myNIC', copyindex())]"
],

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

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

"networkProfile": {
  "networkInterfaces": [ {
    "id": "[resourceId('Microsoft.Network/networkInterfaces',
      concat('myNIC', copyindex())]"
  } ]
},

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

ملفات التعريف

يتم استخدام العديد من عناصر ملف التعريف عند تعريف مورد الجهاز الظاهري. بعضها مطلوب وبعضها اختياري. على سبيل المثال، عناصر hardwareProfile وosProfile وstorageProfile وnetworkProfile مطلوبة، ولكن diagnosticsProfile اختياري. تحدد ملفات التعريف هذه إعدادات مثل:

الأقراص والصور

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

إنشاء أجهزة ظاهرية جديدة وأقراص جديدة من صورة النظام الأساسي

عند إنشاء جهاز ظاهري، يجب أن تقرر نظام التشغيل الذي تريد استخدامه. يتم استخدام عنصر imageReference لتحديد نظام التشغيل الخاص بجهاز ظاهري جديد. يوضح المثال تعريفاً لنظام تشغيل Windows Server:

"imageReference": {
  "publisher": "MicrosoftWindowsServer",
  "offer": "WindowsServer",
  "sku": "2012-R2-Datacenter",
  "version": "latest"
},

إذا كنت ترغب في إنشاء نظام تشغيل Linux، فيمكنك استخدام هذا التعريف:

"imageReference": {
  "publisher": "Canonical",
  "offer": "UbuntuServer",
  "sku": "20.04.2-LTS",
  "version": "latest"
},

ملاحظة

تعديل publisherالقيم و skuofferو version وفقا لذلك.

يتم تعيين إعدادات التكوين لقرص نظام التشغيل مع عنصر osDisk. يعرف المثال قرصا مداراً جديداً مع تعيين وضع التخزين المؤقت إلى ReadWrite وأنه يتم إنشاء القرص من صورة النظام الأساسي:

"osDisk": {
  "name": "[concat('myOSDisk', copyindex())]",
  "caching": "ReadWrite",
  "createOption": "FromImage"
},

إنشاء أجهزة ظاهرية جديدة من الأقراص المدارة الموجودة

إذا كنت ترغب في إنشاء أجهزة ظاهرية من الأقراص الموجودة، فقم بإزالة عنصري imageReference وosProfile وحدد إعدادات القرص التالية:

"osDisk": {
  "osType": "Windows",
  "managedDisk": {
    "id": "[resourceId('Microsoft.Compute/disks', [concat('myOSDisk', copyindex())])]"
  },
  "caching": "ReadWrite",
  "createOption": "Attach"
},

إنشاء أجهزة ظاهرية جديدة من صورة مُدارة

إذا كنت تريد إنشاء جهاز ظاهري من صورة مدارة، فقم بتغيير عنصر imageReference وحدد إعدادات القرص التالية:

"storageProfile": {
  "imageReference": {
    "id": "[resourceId('Microsoft.Compute/images', 'myImage')]"
  },
  "osDisk": {
    "name": "[concat('myOSDisk', copyindex())]",
    "osType": "Windows",
    "caching": "ReadWrite",
    "createOption": "FromImage"
  }
},

إرفاق أقراص البيانات

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

"dataDisks": [
  {
    "name": "[concat('myDataDisk', copyindex())]",
    "diskSizeGB": "100",
    "lun": 0,
    "caching": "ReadWrite",
    "createOption": "Empty"
  }
],

ملحقات

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

{
  "name": "Microsoft.Insights.VMDiagnosticsSettings",
  "type": "extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2016-03-30",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
  ],
  "properties": {
    "publisher": "Microsoft.Azure.Diagnostics",
    "type": "IaaSDiagnostics",
    "typeHandlerVersion": "1.5",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "xmlCfg": "[base64(concat(variables('wadcfgxstart'),
      variables('wadmetricsresourceid'),
      concat('myVM', copyindex()),
      variables('wadcfgxend')))]",
      "storageAccount": "[variables('storageName')]"
    },
    "protectedSettings": {
      "storageAccountName": "[variables('storageName')]",
      "storageAccountKey": "[listkeys(variables('accountid'),
        '2015-06-15').key1]",
      "storageAccountEndPoint": "https://core.windows.net"
    }
  }
},

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

هناك العديد من الملحقات التي يمكنك تثبيتها على جهاز ظاهري، ولكن الأكثر فائدة هو على الأرجح ملحق البرنامج النصي المخصص. في المثال، يتم تشغيل برنامج نصي PowerShell باسم start.ps1 على كل جهاز ظاهري عند بدء تشغيله لأول مرة:

{
  "name": "MyCustomScriptExtension",
  "type": "extensions",
  "apiVersion": "2016-03-30",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
  ],
  "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.7",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "[concat('https://', variables('storageName'),
          '.blob.core.windows.net/customscripts/start.ps1')]"
      ],
      "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File start.ps1"
    }
  }
}

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

يمكنك الاطلاع على حالة الملحقات المثبتة من إعدادات الملحقات في المدخل:

الحصول على حالة الملحق

يمكنك أيضاً الحصول على معلومات الملحق باستخدام الأمر PowerShell Get-AzVMExtension أو الأمر Azure CLI الحصول على ملحق vm أو واجهة برمجة تطبيقات REST الحصول على معلومات الملحق.

عمليات النشر

عند توزيع قالب، يتعقب Azure الموارد التي قمت بتوزيعها كمجموعة ويعين تلقائياً اسماً لهذه المجموعة الموزعة. اسم التوزيع هو ذاته اسم القالب.

إذا كنت مهتماً بحالة الموارد في عملية التوزيع، فقم بعرض مجموعة الموارد في مدخل Azure:

الحصول على معلومات التوزيع

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

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