التشغيل السريع: إنشاء مجموعة مقياس جهاز ظاهري Windows باستخدام قالب ARM

ينطبق على: ✔️ أجهزة ظاهرية بنظام التشغيل Windows ✔️ مجموعات مقياس موحدة

إشعار

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

تسمح لك مجموعة مقياس الجهاز الظاهري بنشر وإدارة مجموعة من الأجهزة الظاهرية ذات التحجيم التلقائي. يمكنك تحجيم عدد الأجهزة الظاهرية في مجموعة التحجيم يدويًّا، أو تحديد قواعد التحجيم التلقائي استنادًا إلى استخدام الموارد مثل CPU، أو طلب الذاكرة، أو عملية نقل بيانات الشبكة. ثم يوزع موازن تحميل Azure عملية نقل البيانات إلى مثيلات الأجهزة الظاهرية في مجموعة التوسعة. في هذا التشغيل السريع، يمكنك إنشاء مجموعة مقياس الجهاز الظاهري ونشر نموذج تطبيق باستخدام قالب Azure Resource Manager (قالب ARM).

قالب Azure Resource Manager هو ملف JavaScript Object Notation (JSON) الذي يحدد البنية الأساسية والتكوين لمشروعك. يستخدم القالب عبارات توضيحية. يمكنك وصف النشر المقصود دون كتابة تسلسل أوامر البرمجة لإنشاء النشر.

تتيح لك قوالب ARM نشر مجموعات من الموارد ذات الصلة. في قالب واحد، يمكنك إنشاء مجموعة مقياس الجهاز الظاهري وتثبيت التطبيقات وتكوين قواعد التحجيم التلقائي. باستخدام المتغيرات والمعلمات، يمكن إعادة استخدام هذا القالب لتحديث مجموعات المقياس الموجودة، أو إنشاء مجموعات إضافية. يمكنك نشر قوالب من خلال مدخل Azure أو Azure CLI أو Azure PowerShell أو من خطوط أنابيب continuous integration / continuous delivery (CI/CD).

إذا كانت بيئتك تلبي المتطلبات الأساسية وكنت معتاداً على استخدام قوالب "ARM"، فحدد زر "Deploy to Azure". سيتم فتح القالب في مدخل Azure.

زر لنشر قالب Resource Manager إلى Azure.

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

في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.

مراجعة القالب

القالب المستخدم في هذا التشغيل السريع مأخوذ من قوالب Azure Quickstart .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.29.47.4906",
      "templateHash": "11422221168065527308"
    }
  },
  "parameters": {
    "vmssName": {
      "type": "string",
      "minLength": 3,
      "maxLength": 61,
      "metadata": {
        "description": "String used as a base for naming resources. Must be 3-61 characters in length and globally unique across Azure. A hash is prepended to this string for some resources, and resource-specific information is appended."
      }
    },
    "vmSku": {
      "type": "string",
      "defaultValue": "Standard_D2s_v3",
      "metadata": {
        "description": "Size of VMs in the VM Scale Set."
      }
    },
    "windowsOSVersion": {
      "type": "string",
      "defaultValue": "2022-datacenter-azure-edition",
      "allowedValues": [
        "2019-DataCenter-GenSecond",
        "2016-DataCenter-GenSecond",
        "2022-datacenter-azure-edition"
      ],
      "metadata": {
        "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter & 2016-Datacenter, 2019-Datacenter."
      }
    },
    "securityType": {
      "type": "string",
      "defaultValue": "TrustedLaunch",
      "allowedValues": [
        "Standard",
        "TrustedLaunch"
      ],
      "metadata": {
        "description": "Security Type of the Virtual Machine."
      }
    },
    "instanceCount": {
      "type": "int",
      "defaultValue": 3,
      "minValue": 1,
      "maxValue": 100,
      "metadata": {
        "description": "Number of VM instances (100 or less)."
      }
    },
    "singlePlacementGroup": {
      "type": "bool",
      "defaultValue": true,
      "metadata": {
        "description": "When true this limits the scale set to a single placement group, of max size 100 virtual machines. NOTE: If singlePlacementGroup is true, it may be modified to false. However, if singlePlacementGroup is false, it may not be modified to true."
      }
    },
    "adminUsername": {
      "type": "string",
      "defaultValue": "vmssadmin",
      "metadata": {
        "description": "Admin username on all VMs."
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Admin password on all VMs."
      }
    },
    "_artifactsLocation": {
      "type": "string",
      "defaultValue": "[deployment().properties.templateLink.uri]",
      "metadata": {
        "description": "The base URI where artifacts required by this template are located. For example, if stored on a public GitHub repo, you'd use the following URI: https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-vmss-windows-webapp-dsc-autoscale/."
      }
    },
    "_artifactsLocationSasToken": {
      "type": "securestring",
      "defaultValue": "",
      "metadata": {
        "description": "The sasToken required to access _artifactsLocation.  If your artifacts are stored on a public repo or public storage account you can leave this blank."
      }
    },
    "powershelldscZip": {
      "type": "string",
      "defaultValue": "DSC/InstallIIS.zip",
      "metadata": {
        "description": "Location of the PowerShell DSC zip file relative to the URI specified in the _artifactsLocation, i.e. DSC/IISInstall.ps1.zip"
      }
    },
    "webDeployPackage": {
      "type": "string",
      "defaultValue": "WebDeploy/DefaultASPWebApp.v1.0.zip",
      "metadata": {
        "description": "Location of the  of the WebDeploy package zip file relative to the URI specified in _artifactsLocation, i.e. WebDeploy/DefaultASPWebApp.v1.0.zip"
      }
    },
    "powershelldscUpdateTagVersion": {
      "type": "string",
      "defaultValue": "1.0",
      "metadata": {
        "description": "Version number of the DSC deployment. Changing this value on subsequent deployments will trigger the extension to run."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    },
    "platformFaultDomainCount": {
      "type": "int",
      "defaultValue": 1,
      "metadata": {
        "description": "Fault Domain count for each placement group."
      }
    }
  },
  "variables": {
    "vmScaleSetName": "[toLower(substring(format('vmssName{0}', uniqueString(resourceGroup().id)), 0, 9))]",
    "longvmScaleSet": "[toLower(parameters('vmssName'))]",
    "addressPrefix": "10.0.0.0/16",
    "subnetPrefix": "10.0.0.0/24",
    "vNetName": "[format('{0}vnet', variables('vmScaleSetName'))]",
    "publicIPAddressName": "[format('{0}pip', variables('vmScaleSetName'))]",
    "subnetName": "[format('{0}subnet', variables('vmScaleSetName'))]",
    "loadBalancerName": "[format('{0}lb', variables('vmScaleSetName'))]",
    "publicIPAddressID": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]",
    "lbProbeID": "[resourceId('Microsoft.Network/loadBalancers/probes', variables('loadBalancerName'), 'tcpProbe')]",
    "natPoolName": "[format('{0}natpool', variables('vmScaleSetName'))]",
    "bePoolName": "[format('{0}bepool', variables('vmScaleSetName'))]",
    "lbPoolID": "[resourceId('Microsoft.Network/loadBalancers/backendAddressPools', variables('loadBalancerName'), variables('bePoolName'))]",
    "natStartPort": 50000,
    "natEndPort": 50119,
    "natBackendPort": 3389,
    "nicName": "[format('{0}nic', variables('vmScaleSetName'))]",
    "ipConfigName": "[format('{0}ipconfig', variables('vmScaleSetName'))]",
    "frontEndIPConfigID": "[resourceId('Microsoft.Network/loadBalancers/frontendIPConfigurations', variables('loadBalancerName'), 'loadBalancerFrontEnd')]",
    "osType": {
      "publisher": "MicrosoftWindowsServer",
      "offer": "WindowsServer",
      "sku": "[parameters('windowsOSVersion')]",
      "version": "latest"
    },
    "securityProfileJson": {
      "uefiSettings": {
        "secureBootEnabled": true,
        "vTpmEnabled": true
      },
      "securityType": "[parameters('securityType')]"
    },
    "imageReference": "[variables('osType')]",
    "webDeployPackageFullPath": "[uri(parameters('_artifactsLocation'), format('{0}{1}', parameters('webDeployPackage'), parameters('_artifactsLocationSasToken')))]",
    "powershelldscZipFullPath": "[uri(parameters('_artifactsLocation'), format('{0}{1}', parameters('powershelldscZip'), parameters('_artifactsLocationSasToken')))]"
  },
  "resources": [
    {
      "type": "Microsoft.Network/loadBalancers",
      "apiVersion": "2023-04-01",
      "name": "[variables('loadBalancerName')]",
      "location": "[parameters('location')]",
      "properties": {
        "frontendIPConfigurations": [
          {
            "name": "LoadBalancerFrontEnd",
            "properties": {
              "publicIPAddress": {
                "id": "[variables('publicIPAddressID')]"
              }
            }
          }
        ],
        "backendAddressPools": [
          {
            "name": "[variables('bePoolName')]"
          }
        ],
        "inboundNatPools": [
          {
            "name": "[variables('natPoolName')]",
            "properties": {
              "frontendIPConfiguration": {
                "id": "[variables('frontEndIPConfigID')]"
              },
              "protocol": "Tcp",
              "frontendPortRangeStart": "[variables('natStartPort')]",
              "frontendPortRangeEnd": "[variables('natEndPort')]",
              "backendPort": "[variables('natBackendPort')]"
            }
          }
        ],
        "loadBalancingRules": [
          {
            "name": "LBRule",
            "properties": {
              "frontendIPConfiguration": {
                "id": "[variables('frontEndIPConfigID')]"
              },
              "backendAddressPool": {
                "id": "[variables('lbPoolID')]"
              },
              "protocol": "Tcp",
              "frontendPort": 80,
              "backendPort": 80,
              "enableFloatingIP": false,
              "idleTimeoutInMinutes": 5,
              "probe": {
                "id": "[variables('lbProbeID')]"
              }
            }
          }
        ],
        "probes": [
          {
            "name": "tcpProbe",
            "properties": {
              "protocol": "Tcp",
              "port": 80,
              "intervalInSeconds": 5,
              "numberOfProbes": 2
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]"
      ]
    },
    {
      "type": "Microsoft.Compute/virtualMachineScaleSets",
      "apiVersion": "2023-09-01",
      "name": "[variables('vmScaleSetName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('vmSku')]",
        "tier": "Standard",
        "capacity": "[parameters('instanceCount')]"
      },
      "properties": {
        "overprovision": true,
        "upgradePolicy": {
          "mode": "Automatic"
        },
        "singlePlacementGroup": "[parameters('singlePlacementGroup')]",
        "platformFaultDomainCount": "[parameters('platformFaultDomainCount')]",
        "virtualMachineProfile": {
          "storageProfile": {
            "osDisk": {
              "caching": "ReadWrite",
              "createOption": "FromImage"
            },
            "imageReference": "[variables('imageReference')]"
          },
          "osProfile": {
            "computerNamePrefix": "[variables('vmScaleSetName')]",
            "adminUsername": "[parameters('adminUsername')]",
            "adminPassword": "[parameters('adminPassword')]"
          },
          "securityProfile": "[if(equals(parameters('securityType'), 'TrustedLaunch'), variables('securityProfileJson'), null())]",
          "networkProfile": {
            "networkInterfaceConfigurations": [
              {
                "name": "[variables('nicName')]",
                "properties": {
                  "primary": true,
                  "ipConfigurations": [
                    {
                      "name": "[variables('ipConfigName')]",
                      "properties": {
                        "subnet": {
                          "id": "[reference(resourceId('Microsoft.Network/virtualNetworks', variables('vNetName')), '2023-04-01').subnets[0].id]"
                        },
                        "loadBalancerBackendAddressPools": [
                          {
                            "id": "[variables('lbPoolID')]"
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          },
          "extensionProfile": {
            "extensions": [
              {
                "name": "Microsoft.Powershell.DSC",
                "properties": {
                  "publisher": "Microsoft.Powershell",
                  "type": "DSC",
                  "typeHandlerVersion": "2.9",
                  "autoUpgradeMinorVersion": true,
                  "forceUpdateTag": "[parameters('powershelldscUpdateTagVersion')]",
                  "settings": {
                    "configuration": {
                      "url": "[variables('powershelldscZipFullPath')]",
                      "script": "InstallIIS.ps1",
                      "function": "InstallIIS"
                    },
                    "configurationArguments": {
                      "nodeName": "localhost",
                      "WebDeployPackagePath": "[variables('webDeployPackageFullPath')]"
                    }
                  }
                }
              }
            ]
          }
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/virtualNetworks', variables('vNetName'))]"
      ]
    },
    {
      "type": "Microsoft.Network/publicIPAddresses",
      "apiVersion": "2023-04-01",
      "name": "[variables('publicIPAddressName')]",
      "location": "[parameters('location')]",
      "properties": {
        "publicIPAllocationMethod": "Static",
        "dnsSettings": {
          "domainNameLabel": "[variables('longvmScaleSet')]"
        }
      }
    },
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2023-04-01",
      "name": "[variables('vNetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[variables('addressPrefix')]"
          ]
        },
        "subnets": [
          {
            "name": "[variables('subnetName')]",
            "properties": {
              "addressPrefix": "[variables('subnetPrefix')]"
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Insights/autoscalesettings",
      "apiVersion": "2022-10-01",
      "name": "autoscalehost",
      "location": "[parameters('location')]",
      "properties": {
        "name": "autoscalehost",
        "targetResourceUri": "[resourceId('Microsoft.Compute/virtualMachineScaleSets', variables('vmScaleSetName'))]",
        "enabled": true,
        "profiles": [
          {
            "name": "Profile1",
            "capacity": {
              "minimum": "1",
              "maximum": "10",
              "default": "1"
            },
            "rules": [
              {
                "metricTrigger": {
                  "metricName": "Percentage CPU",
                  "metricResourceUri": "[resourceId('Microsoft.Compute/virtualMachineScaleSets', variables('vmScaleSetName'))]",
                  "timeGrain": "PT1M",
                  "statistic": "Average",
                  "timeWindow": "PT5M",
                  "timeAggregation": "Average",
                  "operator": "GreaterThan",
                  "threshold": 50
                },
                "scaleAction": {
                  "direction": "Increase",
                  "type": "ChangeCount",
                  "value": "1",
                  "cooldown": "PT5M"
                }
              },
              {
                "metricTrigger": {
                  "metricName": "Percentage CPU",
                  "metricResourceUri": "[resourceId('Microsoft.Compute/virtualMachineScaleSets', variables('vmScaleSetName'))]",
                  "timeGrain": "PT1M",
                  "statistic": "Average",
                  "timeWindow": "PT5M",
                  "timeAggregation": "Average",
                  "operator": "LessThan",
                  "threshold": 30
                },
                "scaleAction": {
                  "direction": "Decrease",
                  "type": "ChangeCount",
                  "value": "1",
                  "cooldown": "PT5M"
                }
              }
            ]
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.Compute/virtualMachineScaleSets', variables('vmScaleSetName'))]"
      ]
    }
  ],
  "outputs": {
    "applicationUrl": {
      "type": "string",
      "value": "[uri(format('http://{0}', reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName')), '2023-04-01').dnsSettings.fqdn), '/MyApp')]"
    }
  }
}

يتم تعريف هذه الموارد في القالب:

إنشاء مجموعة مقياس

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

الخاصية وصف الممتلكات مثال على قيمة القالب
النوع نوع مورد Azure المراد إنشاؤه Microsoft.Compute/virtualMachineScaleSets
الاسم اسم مجموعة المقياس myScaleSet
مكان الموقع لإنشاء مجموعة المقياس شرق الولايات المتحدة
sku.name حجم الجهاز الافتراضي لكل مثيل مجموعة مقياس Standard_A1
sku.capacity عدد مثيلات VM لإنشاء في البداية 2
upgradePolicy.mode وضع ترقية مثيل VM عند حدوث تغييرات تلقائي
imageReference المنصة أو الصورة المخصصة لاستخدامها في مثيلات VM Microsoft Windows Server 2016 Datacenter
osProfile.computerNamePrefix بادئة الاسم لكل مثيل VM Myvmss
osProfile.adminUsername اسم المستخدم لكل مثيل VM azureuser
osProfile.adminPassword كلمة المرور لكل مثيل VM P@ssw0rd!

لتخصيص قالب مجموعة مقياس، يمكنك تغيير حجم الجهاز الافتراضي أو السعة الأولية. خيار آخر هو استخدام نظام أساسي مختلف أو صورة مخصصة.

عينات التطبيقات

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

  • نوع الملحق
  • ناشر الملحق
  • إصدار الملحق
  • موقع التكوين، أو تثبيت البرامج النصية
  • أوامر لتنفيذ على مثيلات VM

يستخدم القالب ملحق PowerShell DSC لتثبيت تطبيق MVC ASP.NET يعمل في IIS.

يتم تنزيل برنامج نصي لتثبيت من GitHub، كما هو محدد في عنوان url. ثم يقوم الملحق بتشغيل InstallIIS من البرنامج النصي IISInstall.ps1 ، كما هو محدد في الدالة والبرنامج النصي. يتم توفير تطبيق ASP.NET نفسه كحزمة Web Deploy، والتي يتم تنزيلها أيضا من GitHub، كما هو محدد في WebDeployPackagePath:

نشر القالب

يمكنك نشر القالب عن طريق تحديد الزر Deploy to Azure . يفتح هذا الزر مدخل Azure، ويحمل القالب الكامل، ويطالب ببعض المعلمات مثل: اسم مجموعة المقياس، وعدد المثيلات، وبيانات اعتماد المسؤول.

زر لنشر قالب Resource Manager إلى Azure.

يمكنك أيضًا نشر قالب إدارة الموارد باستخدام Azure PowerShell:

# Create a resource group
New-AzResourceGroup -Name myResourceGroup -Location EastUS

# Deploy template into resource group
New-AzResourceGroupDeployment `
    -ResourceGroupName myResourceGroup `
    -TemplateURI https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/vmss-windows-webapp-dsc-autoscale/azuredeploy.json

# Update the scale set and apply the extension
Update-AzVmss `
    -ResourceGroupName myResourceGroup `
    -VmScaleSetName myVMSS `
    -VirtualMachineScaleSet $vmssConfig

أجب على المطالبات لتوفير اسم مجموعة مقياس وعدد المثيلات وبيانات اعتماد المسؤول لمثيلات VM. قد يستغرق إنشاء المقياس من 10 إلى 15 دقيقة وتطبيق الإضافة لتكوين التطبيق.

التحقُّق من صحة عملية النشر

لرؤية مجموعة الميزان الخاص بك قيد التنفيذ، قم بالوصول إلى نموذج تطبيق الويب في مستعرض ويب. احصل على عنوان IP العام لموازن التحميل الخاص بك باستخدام Get-AzPublicIpAddress كما يلي:

Get-AzPublicIpAddress -ResourceGroupName myResourceGroup | Select IpAddress

أدخل عنوان IP العام لموازن التحميل في متصفح الويب بتنسيق http://publicIpAddress/MyApp. يوزع موازن التحميل حركة المرور إلى إحدى مثيلات VM الخاصة بك، كما هو موضح في المثال التالي:

تشغيل موقع IIS

تنظيف الموارد

عند عدم الحاجة، يمكنك استخدام Remove-AzResourceGroup لإزالة مجموعة الموارد، مجموعة التحجيم. المعلمة -Force تؤكد رغبتك في حذف الموارد دون مطالبة إضافية للقيام بذلك. تُعيد المعلمة -AsJob التحكم إلى الموجه دون انتظار إكمال العملية.

Remove-AzResourceGroup -Name "myResourceGroup" -Force -AsJob

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

في هذا الـبدء السريع، قمت بإنشاء مجموعة مقياس Linux مع قالب ARM، واستخدام ملحق Custom Script لتثبيت خادم ويب Python الأساسي على مثيلات VM. لمعرفة المزيد، تابع البرنامج التعليمي حول كيفية إنشاء مجموعات مقياس الجهاز الظاهري Azure وإدارتها.