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

ينطبق على: ✔️ مجموعات المقياس المرنة

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

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

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

Deploy to Azure

تنبيه

يتم تعريف وضع التزامن عند إنشاء مجموعة المقياس ولا يمكن تغييره أو تحديثه لاحقاً.

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

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

قالب ARM

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

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

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

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "location": {
        "type": "string",
        "defaultValue": "[resourceGroup().location]",
        "metadata": {
          "description": "Location for all resources"
        }
      },
      "vmSku": {
        "type": "string",
        "defaultValue": "Standard_D1_v2",
        "metadata": {
          "description": "Size of VMs in the VM Scale Set."
        }
      },
      "vmssName": {
        "type": "string",
        "metadata": {
          "description": "String used as a base for naming resources (9 characters or less). A hash is prepended to this string for some resources, and resource-specific information is appended."
        }
      },
      "instanceCount": {
        "type": "int",
        "defaultValue": 1,
        "minValue": 1,
        "maxValue": 100,
        "metadata": {
          "description": "Number of VM instances (100 or less)."
        }
      },
      "adminUsername": {
        "type": "string",
        "metadata": {
          "description": "Admin username on all VMs."
        }
      },
      "authenticationType": {
        "type": "string",
        "defaultValue": "sshPublicKey",
        "allowedValues": [
          "sshPublicKey",
          "password"
        ],
        "metadata": {
          "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
        }
      },
      "adminPasswordOrKey": {
        "type": "securestring",
        "metadata": {
          "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
        }
      },
      "_artifactsLocation": {
        "type": "string",
        "defaultValue": "[deployment().properties.templatelink.uri]",
        "metadata": {
          "description": "The base URI where artifacts required by this template are located"
        }
      },
      "_artifactsLocationSasToken": {
        "type": "securestring",
        "defaultValue": "",
        "metadata": {
          "description": "The sasToken required to access _artifactsLocation.  When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
        }
      }
    },
    "variables": {
      "addressPrefix": "10.0.0.0/16",
      "subnetPrefix": "10.0.0.0/24",
      "networkApiVersion": "2020-11-01",
      "virtualNetworkName": "[concat(parameters('vmssName'), 'vnet')]",
      "publicIPAddressName": "[concat(parameters('vmssName'), 'pip')]",
      "subnetName": "[concat(parameters('vmssName'), 'subnet')]",
      "loadBalancerName": "[concat(parameters('vmssName'), 'lb')]",
      "publicIPAddressID": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]",
      "networkSecurityGroupName": "[concat(parameters('vmssName'), 'nsg')]",
      "bePoolName": "[concat(parameters('vmssName'), 'bepool')]",
      "lbRuleName": "[concat(parameters('vmssName'), 'lbrule')]",
      "lbProbeName": "[concat(parameters('vmssName'), 'lbprobe')]",
      "bePoolConfigID": "[resourceId('Microsoft.Network/loadBalancers/backendAddressPools', variables('loadBalancerName'),variables('bePoolName'))]",
      "lbProbeID": "[resourceId('Microsoft.Network/loadBalancers/probes', variables('loadBalancerName'),variables('lbProbeName'))]",
      "nicName": "[concat(parameters('vmssName'), 'nic')]",
      "ipConfigName": "[concat(parameters('vmssName'), 'ipconfig')]",
      "frontEndIPConfigID": "[resourceId('Microsoft.Network/loadBalancers/frontendIPConfigurations', variables('loadBalancerName'),'loadBalancerFrontEnd')]",
      "osType": {
        "publisher": "Canonical",
        "offer": "UbuntuServer",
        "sku": "16.04-LTS",
        "version": "latest"
      },
      "imageReference": "[variables('osType')]",
      "linuxConfiguration": {
        "disablePasswordAuthentication": true,
        "ssh": {
          "publicKeys": [
            {
              "path": "[concat('/home/', parameters('adminUsername'), '/.ssh/authorized_keys')]",
              "keyData": "[parameters('adminPasswordOrKey')]"
            }
          ]
        }
      }
    },
    "resources": [
              {
            "type": "Microsoft.Network/networkSecurityGroups",
            "apiVersion": "2020-06-01",
            "name": "[variables('networkSecurityGroupName')]",
            "location": "[parameters('location')]",
            "properties": {
                "securityRules": [
                    {
                        "name": "AllowPort9000",
                        "properties": {
                            "protocol": "*",
                            "sourcePortRange": "*",
                            "destinationPortRange": "9000",
                            "sourceAddressPrefix": "Internet",
                            "destinationAddressPrefix": "*",
                            "access": "Allow",
                            "priority": 100,
                            "direction": "Inbound"
                        }
                    }
                ]
            }
        },
      {
        "type": "Microsoft.Network/virtualNetworks",
        "apiVersion": "2020-06-01",
        "name": "[variables('virtualNetworkName')]",
        "location": "[parameters('location')]",
        "properties": {
          "addressSpace": {
            "addressPrefixes": [
              "[variables('addressPrefix')]"
            ]
          },
          "subnets": [
            {
              "name": "[variables('subnetName')]",
              "properties": {
                "addressPrefix": "[variables('subnetPrefix')]",
                "networkSecurityGroup": {
                  "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
                }
              }
            }
          ]
        }
      },
      {
        "type": "Microsoft.Network/publicIPAddresses",
        "apiVersion": "2020-06-01",
        "name": "[variables('publicIPAddressName')]",
        "location": "[parameters('location')]",
        "sku": {
          "name": "Standard"
        },
        "properties": {

          "publicIPAllocationMethod": "Static",
          "dnsSettings": {
            "domainNameLabel": "[parameters('vmssName')]"
          }
        }
      },
      {
        "type": "Microsoft.Network/loadBalancers",
        "apiVersion": "2020-06-01",
        "name": "[variables('loadBalancerName')]",
        "location": "[parameters('location')]",
        "sku": {
          "name": "Standard"
        },
        "dependsOn": [
          "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]"
        ],
        "properties": {
          "frontendIPConfigurations": [
            {
              "name": "LoadBalancerFrontEnd",
              "properties": {
                "publicIPAddress": {
                  "id": "[variables('publicIPAddressID')]"
                }
              }
            }
          ],
          "backendAddressPools": [
            {
              "name": "[variables('bePoolName')]"
            }
          ],
          "probes": [
            {
              "name": "[variables('lbProbeName')]",
              "properties": {
                "port": 9000,
                "protocol": "Tcp",
                "numberOfProbes": 2,
                "intervalInSeconds": 5
              }
            }
          ],
          "loadBalancingRules": [
            {
              "name": "[variables('lbRuleName')]",
              "properties": {
                "frontendIPConfiguration": {
                  "id": "[variables('frontEndIPConfigID')]"
                },
                "backendAddressPool": {
                  "id": "[variables('bePoolConfigID')]"
                },
                "probe": {
                  "id": "[variables('lbProbeID')]"
                },
                "loadDistribution": "Default",
                "backendPort": 9000,
                "frontendPort": 9000,
                "protocol": "Tcp",
                "idleTimeoutInMinutes": 4,
                "enableFloatingIP": false,
                "enableTcpReset": false,
                "disableOutboundSnat": false
              }
             }
          ]
        }
      },
      {
        "type": "Microsoft.Compute/virtualMachineScaleSets",
        "apiVersion": "2021-03-01",
        "name": "[parameters('vmssName')]",
        "location": "[parameters('location')]",
        "sku": {
          "name": "[parameters('vmSku')]",
          "tier": "Standard",
          "capacity": "[parameters('instanceCount')]"
        },
        "dependsOn": [
          "[resourceId('Microsoft.Network/loadBalancers', variables('loadBalancerName'))]",
          "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]"
        ],
        "properties": {
          "orchestrationMode": "Flexible",
          "platformFaultDomainCount": 1,
          "singlePlacementGroup": false,
          "virtualMachineProfile": {
            "storageProfile": {
              "osDisk": {
                "createOption": "FromImage",
                "caching": "ReadWrite"
              },
              "imageReference": "[variables('imageReference')]"
            },
            "osProfile": {
              "computerNamePrefix": "[parameters('vmssName')]",
              "adminUsername": "[parameters('adminUsername')]",
              "adminPassword": "[parameters('adminPasswordOrKey')]",
              "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
            },
            "networkProfile": {
              "networkApiVersion": "[variables('networkApiVersion')]",
              "networkInterfaceConfigurations": [
                {
                  "name": "[variables('nicName')]",
                  "properties": {
                    "primary": true,
                    "ipConfigurations": [
                      {
                        "name": "[variables('ipConfigName')]",
                        "properties": {
                          "primary": true,
                          "subnet": {
                            "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), variables('subnetName'))]"
                          },
                          "loadBalancerBackendAddressPools": [
                            {
                              "id": "[resourceId('Microsoft.Network/loadBalancers/backendAddressPools', variables('loadBalancerName'), variables('bePoolName'))]"
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "extensionProfile": {
              "extensions": [
                {
                  "name": "lapextension",
                  "properties": {
                    "publisher": "Microsoft.Azure.Extensions",
                    "type": "CustomScript",
                    "typeHandlerVersion": "2.0",
                    "autoUpgradeMinorVersion": true,
                    "settings": {
                      "fileUris": [
                        "[uri(parameters('_artifactsLocation'), concat('installserver.sh', parameters('_artifactsLocationSasToken')))]",
                        "[uri(parameters('_artifactsLocation'), concat('workserver.py', parameters('_artifactsLocationSasToken')))]"
                      ],
                      "commandToExecute": "bash installserver.sh"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      {
        "type": "Microsoft.Insights/autoscaleSettings",
        "apiVersion": "2015-04-01",
        "name": "[concat(parameters('vmssName'), '-autoscalehost')]",
        "location": "[parameters('location')]",
        "dependsOn": [
          "[resourceId('Microsoft.Compute/virtualMachineScaleSets', parameters('vmSSName'))]"
        ],
        "properties": {
          "name": "[concat(parameters('vmssName'), '-autoscalehost')]",
          "targetResourceUri": "[resourceId('Microsoft.Compute/virtualMachineScaleSets', parameters('vmSSName'))]",
          "enabled": true,
          "profiles": [
            {
              "name": "Profile1",
              "capacity": {
                "minimum": "1",
                "maximum": "10",
                "default": "1"
              },
              "rules": [
                {
                  "metricTrigger": {
                    "metricName": "Percentage CPU",
                    "metricResourceUri": "[resourceId('Microsoft.Compute/virtualMachineScaleSets', parameters('vmSSName'))]",
                    "timeGrain": "PT1M",
                    "statistic": "Average",
                    "timeWindow": "PT5M",
                    "timeAggregation": "Average",
                    "operator": "GreaterThan",
                    "threshold": 60
                  },
                  "scaleAction": {
                    "direction": "Increase",
                    "type": "ChangeCount",
                    "value": "1",
                    "cooldown": "PT1M"
                  }
                },
                {
                  "metricTrigger": {
                    "metricName": "Percentage CPU",
                    "metricResourceUri": "[resourceId('Microsoft.Compute/virtualMachineScaleSets', parameters('vmSSName'))]",
                    "timeGrain": "PT1M",
                    "statistic": "Average",
                    "timeWindow": "PT5M",
                    "timeAggregation": "Average",
                    "operator": "LessThan",
                    "threshold": 30
                  },
                  "scaleAction": {
                    "direction": "Decrease",
                    "type": "ChangeCount",
                    "value": "1",
                    "cooldown": "PT1M"
                  }
                }
              ]
            }
          ]
        }
      }
    ]
  }

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

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

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

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

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

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

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

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

يستخدم القالب ملحق Custom Script لتثبيت ⁧⁩Bottle⁧⁩، وإطار ويب Python، وخادم HTTP بسيط.

يتم تعريف اثنين من البرامج النصية في ⁧⁩fileUris⁧⁩⁧ - ⁩⁧⁩installserver.sh⁧⁩، and ⁧⁩workserver.py⁧⁩. يتم تنزيل هذه الملفات من GitHub، ثم يتم تشغيل ⁧⁩commandToExecute⁧⁩⁧bash installserver.sh⁩لتثبيت التطبيق وتكوينه.

نشر القالب

يمكنك أيضًا نشر قالب Resource Manager باستخدام Azure CLI:

# Create a resource group
az group create --name myResourceGroup --location EastUS

# Deploy template into resource group
az deployment group create -g myResourceGroup -f azuredeploy.json --parameters _artifactsLocation=https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/application-workloads/python/vmss-bottle-autoscale/azuredeploy.json

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

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

لرؤية مجموعة التوسعة قيد التنفيذ، قم بالوصول إلى نموذج تطبيق الويب في مستعرض ويب. احصل على عنوان IP العام الخاص بموازن التحميل باستخدام ⁧⁩az network public-ip show⁧⁩ كما يلي:

az network public-ip list \
    --resource-group myResourceGroup \
    --query [*].ipAddress -o tsv

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

Default web page in NGINX

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

عندما لم تعد هناك حاجة، يمكنك استخدام ⁧⁩az group delete⁧⁩ لإزالة مجموعة الموارد، ومجموعة التوسعة، وجميع الموارد ذات الصلة على النحو التالي. تُعيد المعلمة --no-wait التحكم إلى الموجه دون انتظار اكتمال العملية. تؤكد المعلمة ⁧--yes⁩ رغبتك في حذف الموارد دون مطالبة إضافية للقيام بذلك.

az group delete --name myResourceGroup --yes --no-wait

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