كيفية إنشاء جهاز Linux ظاهري باستخدام قوالب Azure Resource Manager

ينطبق على: ✔️ أجهزة Linux الظاهرية ✔️ مجموعات مقياس مرنة

تعرف على كيفية إنشاء جهاز Linux الظاهري باستخدام قالب Azure Resource Manager وAzure CLI من Azure Cloud shell. لإنشاء جهاز Windows ظاهري، راجع إنشاء جهاز Windows ظاهري من قالب Resource Manager.

يتمثل البديل في توزيع القالب من مدخل Azure. حدد زر التوزيع إلى Azure لفتح القالب في المدخل.

Deploy to Azure

نظرة عامة على القوالب

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

إنشاء جهاز ظاهري

يشتمل إنشاء جهاز Azure ظاهري عادة على خطوتين:

  1. إنشاء مجموعة موارد. مجموعة موارد Azure هي حاوية منطقية يتم بها نشر موارد Azure وإدارتها. يجب إنشاء مجموعة موارد قبل جهاز ظاهري.
  2. إنشاء جهاز افتراضي.

يقوم المثال التالي بإنشاء جهاز ظاهري من قالب التشغيل السريع لـ Azure. ينشئ هذا القالب جهازًا ظاهريًا لـ Azure من الجيل 2 بشكل افتراضي. راجع دعم الجيل 2 من الأجهزة الظاهرية على Azure لمعرفة المزيد حول الأجهزة الظاهرية من الجيل 2. يسمح فقط بمصادقة SSH لهذا التوزيع. عند المطالبة، قم بتوفير قيمة مفتاح SSH العام، مثل محتويات ~/.ssh/id_rsa.pub. إذا كنت بحاجة إلى إنشاء مفتاح SSH مزدوج، فراجع كيفية إنشاء زوج SSH مزدوج واستخدامه لأجهزة Linux الظاهرية في Azure. فيما يلي نسخة من القالب:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specifies a name for generating resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specifies the location for all resources."
      }
    },
    "adminUsername": {
      "type": "string",
      "metadata": {
        "description": "Specifies a username for the Virtual Machine."
      }
    },
    "adminPublicKey": {
      "type": "string",
      "metadata": {
        "description": "Specifies the SSH rsa public key file as a string. Use \"ssh-keygen -t rsa -b 2048\" to generate your SSH key pairs."
      }
    },
    "vmSize": {
      "type": "string",
      "defaultValue": "Standard_D2s_v3",
      "metadata": {
        "description": "description"
      }
    }
  },
  "variables": {
    "vNetName": "[concat(parameters('projectName'), '-vnet')]",
    "vNetAddressPrefixes": "10.0.0.0/16",
    "vNetSubnetName": "default",
    "vNetSubnetAddressPrefix": "10.0.0.0/24",
    "vmName": "[concat(parameters('projectName'), '-vm')]",
    "publicIPAddressName": "[concat(parameters('projectName'), '-ip')]",
    "networkInterfaceName": "[concat(parameters('projectName'), '-nic')]",
    "networkSecurityGroupName": "[concat(parameters('projectName'), '-nsg')]",
    "networkSecurityGroupName2": "[concat(variables('vNetSubnetName'), '-nsg')]"
  },
  "resources": [
    {
      "type": "Microsoft.Network/networkSecurityGroups",
      "apiVersion": "2020-05-01",
      "name": "[variables('networkSecurityGroupName')]",
      "location": "[parameters('location')]",
      "properties": {
        "securityRules": [
          {
            "name": "ssh_rule",
            "properties": {
              "description": "Locks inbound down to ssh default port 22.",
              "protocol": "Tcp",
              "sourcePortRange": "*",
              "destinationPortRange": "22",
              "sourceAddressPrefix": "*",
              "destinationAddressPrefix": "*",
              "access": "Allow",
              "priority": 123,
              "direction": "Inbound"
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Network/publicIPAddresses",
      "apiVersion": "2020-05-01",
      "name": "[variables('publicIPAddressName')]",
      "location": "[parameters('location')]",
      "properties": {
        "publicIPAllocationMethod": "Dynamic"
      },
      "sku": {
        "name": "Basic"
      }
    },
    {
      "comments": "Simple Network Security Group for subnet [variables('vNetSubnetName')]",
      "type": "Microsoft.Network/networkSecurityGroups",
      "apiVersion": "2020-05-01",
      "name": "[variables('networkSecurityGroupName2')]",
      "location": "[parameters('location')]",
      "properties": {
        "securityRules": [
          {
            "name": "default-allow-22",
            "properties": {
              "priority": 1000,
              "access": "Allow",
              "direction": "Inbound",
              "destinationPortRange": "22",
              "protocol": "Tcp",
              "sourceAddressPrefix": "*",
              "sourcePortRange": "*",
              "destinationAddressPrefix": "*"
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2020-05-01",
      "name": "[variables('vNetName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName2'))]"
      ],
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[variables('vNetAddressPrefixes')]"
          ]
        },
        "subnets": [
          {
            "name": "[variables('vNetSubnetName')]",
            "properties": {
              "addressPrefix": "[variables('vNetSubnetAddressPrefix')]",
              "networkSecurityGroup": {
                "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName2'))]"
              }
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Network/networkInterfaces",
      "apiVersion": "2020-05-01",
      "name": "[variables('networkInterfaceName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]",
        "[resourceId('Microsoft.Network/virtualNetworks', variables('vNetName'))]",
        "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]"
              },
              "subnet": {
                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vNetName'), variables('vNetSubnetName'))]"
              }
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2021-11-01",
      "name": "[variables('vmName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[parameters('vmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "linuxConfiguration": {
            "disablePasswordAuthentication": true,
            "ssh": {
              "publicKeys": [
                {
                  "path": "[concat('/home/', parameters('adminUsername'), '/.ssh/authorized_keys')]",
                  "keyData": "[parameters('adminPublicKey')]"
                }
              ]
            }
          }
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "Canonical",
            "offer": "UbuntuServer",
            "sku": "18_04-lts-gen2",
            "version": "latest"
          },
          "osDisk": {
            "createOption": "fromImage"
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
            }
          ]
        }
      }
    }
  ]
}

لتشغيل برنامج CLI النصي، حدد جربه لفتح Azure Cloud shell. للصق البرنامج النصي، انقر بزر الماوس الأيمن فوق shell، ثم حدد لصق:

echo "Enter the Resource Group name:" &&
read resourceGroupName &&
echo "Enter the location (i.e. centralus):" &&
read location &&
echo "Enter the project name (used for generating resource names):" &&
read projectName &&
echo "Enter the administrator username:" &&
read username &&
echo "Enter the SSH public key:" &&
read key &&
az group create --name $resourceGroupName --location "$location" &&
az deployment group create --resource-group $resourceGroupName --template-uri https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/quickstarts/microsoft.compute/vm-sshkey/azuredeploy.json --parameters projectName=$projectName adminUsername=$username adminPublicKey="$key" &&
az vm show --resource-group $resourceGroupName --name "$projectName-vm" --show-details --query publicIps --output tsv

يعرض الأمر الأخير لـ Azure CLI عنوان IP العام للجهاز الظاهري الذي تم إنشاؤه حديثًا. تحتاج إلى عنوان IP العام للاتصال بالجهاز الظاهري. راجع القسم التالي من هذه المقالة.

في المثال السابق، قمت بتحديد قالب مُخزَّن في GitHub. يمكنك أيضًا تنزيل قالب أو إنشائه وتحديد المسار المحلي باستخدام المعلمة --template-file.

فيما يلي بعض الموارد الإضافية:

قم بالاتصال بالجهاز الظاهري

يمكنك بعد ذلك اتصال SSH إلى جهازك الظاهري كالمعتاد. قم بتوفير عنوان IP العام من الأمر السابق:

ssh <adminUsername>@<ipAddress>

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

في هذا المثال، قمت بإنشاء جهاز ظاهري أساسي بنظام التشغيل Linux. لمزيد من قوالب Resource Manager التي تتضمن أطر عمل التطبيقات أو إنشاء بيئات أكثر تعقيدًا، استعرض قوالب التشغيل السريع من Azure.

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