نشر الخدمات السحابية (الدعم الموسع) باستخدام قالب ARM

توضح هذه المقالة كيفية استخدام قالب Azure Resource Manager (قالب ARM) لإنشاء نشر خدمات Azure Cloud (الدعم الموسع).

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

أكمل الخطوات التالية كمتطلبات أساسية لإنشاء التوزيع باستخدام قوالب ARM.

  1. راجع متطلبات النشر الأساسية للخدمات السحابية (الدعم الموسع) وأنشئ الموارد المطلوبة.

  2. إنشاء مجموعة موارد جديدة باستخدام مدخل Microsoft Azure أو Azure PowerShell. هذه الخطوة اختيارية إذا كنت تستخدم مجموعة موارد موجودة.

  3. إنشاء حساب تخزين جديد باستخدام مدخل Azure أو Azure PowerShell. هذه الخطوة اختيارية إذا كنت تستخدم حساب تخزين موجود.

  4. قم بتحميل ملف الحزمة (.cspkg أو .zip) وملف التكوين (.cscfg) إلى حساب التخزين باستخدام مدخل Microsoft Azure أو Azure PowerShell. احفظ عناوين URL لتوقيع الوصول المشترك (SAS) لكلا الملفين لإضافتها إلى قالب ARM في خطوة لاحقة.

  5. (اختياري) إنشاء key vault، وتحميل الشهادات.

    • يمكنك إرفاق شهادات إلى النشر الخاص بك للاتصال الآمن من وإلى الخدمة. إذا كنت تستخدم الشهادات، يجب تحديد بصمة إبهام الشهادة في ملف التكوين (.cscfg) وتحميلها إلى مخزن مفاتيح. يمكنك إنشاء مخزن مفاتيح باستخدام مدخل Microsoft Azure أو Azure PowerShell.
    • يجب أن يكون مخزن المفاتيح المقترن في نفس المنطقة والاشتراك مثل نشر الخدمات السحابية (الدعم الموسع).
    • يجب أن يكون لدى خزنة المفاتيح المقترنة الأذونات ذات الصلة بحيث يمكن لموارد الخدمات السحابية (الدعم الموسع) استرداد الشهادات من مخزن المفاتيح. لمزيد من المعلومات، راجع استخدام الشهادات مع الخدمات السحابية (الدعم الموسع).
    • يجب الرجوع إلى مخزن المفاتيح في osProfile قسم من قالب ARM كما هو موضح في خطوة لاحقة.

نشر Cloud Services (extended support)

لنشر الخدمات السحابية (الدعم الموسع) باستخدام قالب:

إشعار

طريقة أسهل وأسرع لإنشاء قالب ARM وملف المعلمة الخاص بك هي باستخدام مدخل Microsoft Azure. يمكنك تنزيل قالب ARM الذي تم إنشاؤه في المدخل لإنشاء الخدمات السحابية (الدعم الموسع) عبر Azure PowerShell.

  1. أنشئ شبكة ظاهرية. يجب أن يتطابق اسم الشبكة الظاهرية مع مراجع الشبكة الظاهرية في ملف التكوين (.cscfg). إذا كنت تستخدم شبكة ظاهرية موجودة، فاحذف هذا القسم من قالب ARM.

    "resources": [ 
        { 
          "apiVersion": "2019-08-01", 
          "type": "Microsoft.Network/virtualNetworks", 
          "name": "[parameters('vnetName')]", 
          "location": "[parameters('location')]", 
          "properties": { 
            "addressSpace": { 
              "addressPrefixes": [ 
                "10.0.0.0/16" 
              ] 
            }, 
            "subnets": [ 
              { 
                "name": "WebTier", 
                "properties": { 
                  "addressPrefix": "10.0.0.0/24" 
                } 
              } 
            ] 
          } 
        } 
    ] 
    

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

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. إنشاء عنوان IP عام و (اختياريا) تعيين الخاصية تسمية DNS لعنوان IP العمومي. إذا كنت تستخدم عنوان IP ثابتا، يجب الرجوع إليه كعنوان IP محجوز في ملف التكوين (.cscfg). إذا كنت تستخدم عنوان IP موجودا، فتخط هذه الخطوة وأضف معلومات عنوان IP مباشرة في إعدادات تكوين موازن التحميل في قالب ARM الخاص بك.

    "resources": [ 
        { 
          "apiVersion": "2019-08-01", 
          "type": "Microsoft.Network/publicIPAddresses", 
          "name": "[parameters('publicIPName')]", 
          "location": "[parameters('location')]", 
          "properties": { 
            "publicIPAllocationMethod": "Dynamic", 
            "idleTimeoutInMinutes": 10, 
            "publicIPAddressVersion": "IPv4", 
            "dnsSettings": { 
              "domainNameLabel": "[variables('dnsName')]" 
            } 
          }, 
          "sku": { 
            "name": "Basic" 
          } 
        } 
    ] 
    

    إذا قمت بإنشاء عنوان IP جديد، أضف الأسطر التالية إلى dependsOn القسم للتأكد من أن النظام الأساسي ينشئ عنوان IP قبل أن ينشئ مثيل الخدمات السحابية (الدعم الموسع):

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. إنشاء كائن الخدمات السحابية (الدعم الموسع). أضف مراجع ذات صلة dependsOn إذا قمت بنشر شبكات ظاهرية أو عناوين IP عامة في القالب الخاص بك.

    {
      "apiVersion": "2021-03-01",
      "type": "Microsoft.Compute/cloudServices",
      "name": "[variables('cloudServiceName')]",
      "location": "[parameters('location')]",
      "tags": {
        "DeploymentLabel": "[parameters('deploymentLabel')]",
        "DeployFromVisualStudio": "true"
      },
      "dependsOn": [
        "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]",
        "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]"
      ],
      "properties": {
        "packageUrl": "[parameters('packageSasUri')]",
        "configurationUrl": "[parameters('configurationSasUri')]",
        "upgradeMode": "[parameters('upgradeMode')]"
      }
    }
    
  4. إنشاء كائن ملف تعريف شبكة للتوزيع الخاص بك، وربط عنوان IP العام بالواجهة الأمامية لموازن التحميل. يقوم النظام الأساسي Azure تلقائيا بإنشاء موازن تحميل.

    "networkProfile": { 
        "loadBalancerConfigurations": [ 
          { 
            "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/loadBalancers/', variables('lbName'))]", 
            "name": "[variables('lbName')]", 
            "properties": { 
              "frontendIPConfigurations": [ 
                { 
                  "name": "[variables('lbFEName')]", 
                  "properties": { 
                    "publicIPAddress": { 
                      "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
                    } 
                  } 
                } 
              ] 
            } 
          } 
        ] 
      } 
    
  5. أضف مرجع key vault في osProfile قسم من قالب ARM. يخزن المخزن الرئيسي الشهادات المقترنة بخدمات السحابة (الدعم الموسع). أضف الشهادات إلى key vault، ثم قم بالإشارة إلى بصمة إبهام الشهادة في ملف التكوين (.cscfg). أيضا، قم بتعيين نهج الوصول إلى مخزن المفاتيح لأجهزة Azure الظاهرية للنشر في مدخل Azure بحيث يمكن لمورد الخدمات السحابية (الدعم الموسع) استرداد الشهادات المخزنة كأسرار في مخزن المفاتيح. يجب أن يكون مخزن المفاتيح في نفس المنطقة والاشتراك مثل مورد الخدمات السحابية (الدعم الموسع) وأن يكون له اسم فريد. لمزيد من المعلومات، راجع استخدام الشهادات مع الخدمات السحابية (الدعم الموسع).

    "osProfile": { 
          "secrets": [ 
            { 
              "sourceVault": { 
                "id": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.KeyVault/vaults/{keyvault-name}" 
              }, 
              "vaultCertificates": [ 
                { 
                  "certificateUrl": "https://{keyvault-name}.vault.azure.net:443/secrets/ContosoCertificate/{secret-id}" 
                } 
              ] 
            } 
          ] 
        } 
    

    إشعار

    sourceVaultفي قالب ARM هي قيمة معرف المورد لمخزن المفاتيح الخاص بك. يمكنك الحصول على هذه المعلومات عن طريق العثور على معرف المورد في قسم الخصائص في مخزن المفاتيح الخاص بك.

    • يمكنك الحصول على قيمة عن certificateUrl طريق الانتقال إلى الشهادة في مخزن المفاتيح المسمى المعرف السري. 
    • certificateUrl يجب أن يكون على شكل https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}.
  6. إنشاء ملف تعريف دور. تأكد من أن عدد الأدوار وعدد المثيلات في كل دور وأسماء الأدوار وأحجام الأدوار هي نفسها عبر ملف التكوين (.cscfg) وملف التعريف (.csdef) والمقطع roleProfile في قالب ARM.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (اختياري) إنشاء ملف تعريف ملحق لإضافة ملحقات إلى نشر الخدمات السحابية (الدعم الموسع). يضيف المثال التالي ملحق بروتوكول سطح المكتب البعيد (RDP) وملحق تشخيص Azure.

    إشعار

    يجب أن تتراوح كلمة مرور RDP من 8 إلى 123 حرفا ويجب أن تفي بثلاثة على الأقل من متطلبات تعقيد كلمة المرور التالية:

    يحتوي على حرف أحرف كبيرة.
    يحتوي على حرف بأحرف صغيرة.
    يحتوي على رقم.
    يحتوي على حرف خاص.
    لا يمكن أن يحتوي على حرف عنصر تحكم.

        "extensionProfile": {
          "extensions": [
            {
              "name": "RDPExtension",
              "properties": {
                "autoUpgradeMinorVersion": true,
                "publisher": "Microsoft.Windows.Azure.Extensions",
                "type": "RDP",
                "typeHandlerVersion": "1.2.1",
                "settings": "<PublicConfig>\r\n <UserName>[Insert Username]</UserName>\r\n <Expiration>1/21/2022 12:00:00 AM</Expiration>\r\n</PublicConfig>",
                "protectedSettings": "<PrivateConfig>\r\n <Password>[Insert Password]</Password>\r\n</PrivateConfig>"
              }
            },
            {
              "name": "Microsoft.Insights.VMDiagnosticsSettings_WebRole1",
              "properties": {
                "autoUpgradeMinorVersion": true,
                "publisher": "Microsoft.Azure.Diagnostics",
                "type": "PaaSDiagnostics",
                "typeHandlerVersion": "1.5",
                "settings": "[parameters('wadPublicConfig_WebRole1')]",
                "protectedSettings": "[parameters('wadPrivateConfig_WebRole1')]",
                "rolesAppliedTo": [
                  "WebRole1"
                ]
              }
            }
          ]
        }
    
  8. راجع القالب الكامل:

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "cloudServiceName": {
          "type": "string",
          "metadata": {
            "description": "Name of the cloud service"
          }
        },
        "location": {
          "type": "string",
          "metadata": {
            "description": "Location of the cloud service"
          }
        },
        "deploymentLabel": {
          "type": "string",
          "metadata": {
            "description": "Label of the deployment"
          }
        },
        "packageSasUri": {
          "type": "securestring",
          "metadata": {
            "description": "SAS URI of the package (.cspkg) file to deploy"
          }
        },
        "configurationSasUri": {
          "type": "securestring",
          "metadata": {
            "description": "SAS URI of the configuration (.cscfg) file"
          }
        },
        "roles": {
          "type": "array",
          "metadata": {
            "description": "Roles created in the cloud service application"
          }
        },
        "wadPublicConfig_WebRole1": {
          "type": "string",
          "metadata": {
             "description": "Public configuration of the Azure Diagnostics extension"
          }
        },
        "wadPrivateConfig_WebRole1": {
          "type": "securestring",
          "metadata": {
            "description": "Private configuration of the Azure Diagnostics extension"
          }
        },
        "vnetName": {
          "type": "string",
          "defaultValue": "[concat(parameters('cloudServiceName'), 'VNet')]",
          "metadata": {
            "description": "Name of vitual network"
          }
        },
        "publicIPName": {
          "type": "string",
          "defaultValue": "contosocsIP",
          "metadata": {
            "description": "Name of public IP address"
          }
        },
        "upgradeMode": {
          "type": "string",
          "defaultValue": "Auto",
          "metadata": {
            "UpgradeMode": "UpgradeMode of the CloudService"
          }
        }
      },
      "variables": {
        "cloudServiceName": "[parameters('cloudServiceName')]",
        "subscriptionID": "[subscription().subscriptionId]",
        "dnsName": "[variables('cloudServiceName')]",
        "lbName": "[concat(variables('cloudServiceName'), 'LB')]",
        "lbFEName": "[concat(variables('cloudServiceName'), 'LBFE')]",
        "resourcePrefix": "[concat('/subscriptions/', variables('subscriptionID'), '/resourceGroups/', resourceGroup().name, '/providers/')]"
      },
      "resources": [
        {
          "apiVersion": "2019-08-01",
          "type": "Microsoft.Network/virtualNetworks",
          "name": "[parameters('vnetName')]",
          "location": "[parameters('location')]",
          "properties": {
            "addressSpace": {
              "addressPrefixes": [
                "10.0.0.0/16"
              ]
            },
            "subnets": [
              {
                "name": "WebTier",
                "properties": {
                  "addressPrefix": "10.0.0.0/24"
                }
              }
            ]
          }
        },
        {
          "apiVersion": "2019-08-01",
          "type": "Microsoft.Network/publicIPAddresses",
          "name": "[parameters('publicIPName')]",
          "location": "[parameters('location')]",
          "properties": {
            "publicIPAllocationMethod": "Dynamic",
            "idleTimeoutInMinutes": 10,
            "publicIPAddressVersion": "IPv4",
            "dnsSettings": {
              "domainNameLabel": "[variables('dnsName')]"
            }
          },
          "sku": {
            "name": "Basic"
          }
        },
        {
          "apiVersion": "2021-03-01",
          "type": "Microsoft.Compute/cloudServices",
          "name": "[variables('cloudServiceName')]",
          "location": "[parameters('location')]",
          "tags": {
            "DeploymentLabel": "[parameters('deploymentLabel')]",
            "DeployFromVisualStudio": "true"
          },
          "dependsOn": [
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]",
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]"
          ],
          "properties": {
            "packageUrl": "[parameters('packageSasUri')]",
            "configurationUrl": "[parameters('configurationSasUri')]",
            "upgradeMode": "[parameters('upgradeMode')]",
            "roleProfile": {
              "roles": [
                {
                  "name": "WebRole1",
                  "sku": {
                    "name": "Standard_D1_v2",
                    "capacity": "1"
                  }
                },
                {
                  "name": "WorkerRole1",
                  "sku": {
                    "name": "Standard_D1_v2",
                    "capacity": "1"
                  }
                }
              ]
            },
            "networkProfile": {
              "loadBalancerConfigurations": [
                {
                  "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/loadBalancers/', variables('lbName'))]",
                  "name": "[variables('lbName')]",
                  "properties": {
                    "frontendIPConfigurations": [
                      {
                        "name": "[variables('lbFEName')]",
                        "properties": {
                          "publicIPAddress": {
                            "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]"
                          }
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "osProfile": {
              "secrets": [
                {
                  "sourceVault": {
                    "id": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.KeyVault/vaults/{keyvault-name}"
                  },
                  "vaultCertificates": [
                    {
                      "certificateUrl": "https://{keyvault-name}.vault.azure.net:443/secrets/ContosoCertificate/{secret-id}"
                    }
                  ]
                }
              ]
            },
            "extensionProfile": {
              "extensions": [
                {
                  "name": "RDPExtension",
                  "properties": {
                    "autoUpgradeMinorVersion": true,
                    "publisher": "Microsoft.Windows.Azure.Extensions",
                    "type": "RDP",
                    "typeHandlerVersion": "1.2.1",
                    "settings": "<PublicConfig>\r\n <UserName>[Insert Username]</UserName>\r\n <Expiration>1/21/2022 12:00:00 AM</Expiration>\r\n</PublicConfig>",
                    "protectedSettings": "<PrivateConfig>\r\n <Password>[Insert Password]</Password>\r\n</PrivateConfig>"
                  }
                },
                {
                  "name": "Microsoft.Insights.VMDiagnosticsSettings_WebRole1",
                  "properties": {
                    "autoUpgradeMinorVersion": true,
                    "publisher": "Microsoft.Azure.Diagnostics",
                    "type": "PaaSDiagnostics",
                    "typeHandlerVersion": "1.5",
                    "settings": "[parameters('wadPublicConfig_WebRole1')]",
                    "protectedSettings": "[parameters('wadPrivateConfig_WebRole1')]",
                    "rolesAppliedTo": [
                      "WebRole1"
                  ]
                }
              }
            ]
          }
        }
       }
      ]
    }
    
  9. لإنشاء نشر الخدمات السحابية (الدعم الموسع)، انشر ملف القالب والمعلمة (لتعريف المعلمات في ملف القالب). يمكنك استخدام نماذج القوالب هذه.

    New-AzResourceGroupDeployment -ResourceGroupName "ContosOrg" -TemplateFile "file path to your template file" -TemplateParameterFile "file path to your parameter file"