تمرين - إضافة برنامج نصي للتوزيع إلى قالب ARM

مكتمل

هام

تحتاج إلى اشتراك Azure الخاص بك لتشغيل هذا التمرين، وقد تتكبد رسوماً. إذا لم يكن لديك بالفعل اشتراك Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.

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

في هذا التمرين، سوف تأخذ قالب Azure Resource Manager الحالي وتضيف برنامجًا نصيًا جديدًا للتوزيع.

أثناء العملية، ستقوم بما يلي:

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

يستخدم هذا التمرين أدوات Azure Resource Manager ل Visual Studio Code. تأكد من تثبيت هذا الملحق في التعليمة البرمجية لـ Visual Studio.

يستخدم هذا التمرين ملحق Bicep لـ Visual Studio Code. تأكد من تثبيت هذا الملحق في التعليمة البرمجية لـ Visual Studio.

إنشاء قالب البدء

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

  1. فتح Visual Studio Code.

  2. أنشئ ملفاً جديداً يسمى azuredeploy.json.

  3. احفظ الملف الفارغ بحيث يتمكن Visual Studio Code من تحميل أدوات قالب ARM.

    يمكنك إما تحديد File>Save As، أو تحديد Ctrl+S في Windows (⌘+S في macOS). تأكد من تذكر المكان الذي حفظت فيه الملف. على سبيل المثال، قد تحتاج إلى إنشاء مجلد البرامج النصية لحفظه فيه.

  4. انسخ قالب البداية التالي إلى azuredeploy.json.

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.1",
        "apiProfile": "",
        "parameters": {},
        "variables": {
            "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
            "storageBlobContainerName": "config"
        },
        "functions": [],
        "resources": [
            {
                "name": "[variables('storageAccountName')]",
                "type": "Microsoft.Storage/storageAccounts",
                "apiVersion": "2019-06-01",
                "tags": {
                    "displayName": "[variables('storageAccountName')]"
                },
                "location": "[resourceGroup().location]",
                "kind": "StorageV2",
                "sku": {
                    "name": "Standard_LRS",
                    "tier": "Standard"
                },
                "properties": {
                    "encryption": {
                        "services": {
                            "blob": {
                                "enabled": true
                            }
                        },
                        "keySource": "Microsoft.Storage"
                    },
                    "supportsHttpsTrafficOnly": true
                }
            },
            {
                "type": "Microsoft.Storage/storageAccounts/blobServices",
                "apiVersion": "2019-04-01",
                "name": "[concat(variables('storageAccountName'), '/default')]",
                "dependsOn": [
                    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
                ]
            },
            {
                "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
                "apiVersion": "2019-04-01",
                "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
                "dependsOn": [
                    "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
                    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
                ],
                "properties": {
                    "publicAccess": "Blob"
                }
            }
        ]
    }
    
  5. حفظ القالب.

  1. فتح Visual Studio Code.

  2. قم بإنشاء ملف جديد يسمى main.bicep.

  3. احفظ الملف الفارغ بحيث يقوم Visual Studio Code بتحميل أدوات Bicep.

    يمكنك إما تحديد File>Save As، أو تحديد Ctrl+S في Windows (⌘+S في macOS). تأكد من تذكر المكان الذي حفظت فيه الملف. على سبيل المثال، قد ترغب في إنشاء مجلد للبرامج النصية لحفظ الملف به.

  4. انسخ قالب البداية التالي إلى main.bicep.

    var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
    var storageBlobContainerName = 'config'
    
    resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' = {
      name: storageAccountName
      tags: {
        displayName: storageAccountName
      }
      location: resourceGroup().location
      kind: 'StorageV2'
      sku: {
        name: 'Standard_LRS'
        tier: 'Standard'
      }
      properties: {
        encryption: {
          services: {
            blob: {
              enabled: true
            }
          }
          keySource: 'Microsoft.Storage'
        }
        supportsHttpsTrafficOnly: true
      }
    
      resource blobService 'blobServices' existing = {
        name: 'default'
      }
    }
    
    resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
      parent: storageAccount::blobService
      name: storageBlobContainerName
      properties: {
        publicAccess: 'Blob'
      }
    }
    
  5. حفظ القالب.

إضافة الهوية المُدارة التي يعيّنها المُستخدم

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

  1. قم بتحرير القسم variables من azuredeploy.json لتضمين ما يلي:

    "userAssignedIdentityName": "configDeployer",
    
  2. قم بتحرير القسم resources من azuredeploy.json لتضمين ما يلي:

    {
        "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
        "apiVersion": "2018-11-30",
        "name": "[variables('userAssignedIdentityName')]",
        "location": "[resourceGroup().location]"
    }
    
  3. حفظ القالب.

  1. ضمن تعريفات المتغير في main.bicep، أضف التالي:

    var userAssignedIdentityName = 'configDeployer'
    
  2. ضمن تعريفات الموارد، أضف:

    resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
      name: userAssignedIdentityName
      location: resourceGroup().location
    }
    
  3. حفظ القالب.

تعيين دور المساهم للهوية المدارة

الآن، بعد أن تم تعريف هوية مدارة، يمكنك تعيين دور له حقوق لمجموعة الموارد. ستقوم بتعيين دور المساهم. يمكنك تحديد دور بواسطة معرف تعريف الدور الخاص به، وهو معرّف فريد عمومي. يتم تضمين دور المساهم في Azure بحيث يتم توثيق معرف تعريف الدور.

يحتاج تعيين الدور أيضًا إلى اسم المعرّف الفريد العمومي. يمكنك استخدام الدالة guid لإنشاء معرّف فريد عمومي لمجموعة الموارد واسم الدور.

  1. قم بتحرير القسم variables من azuredeploy.json لتضمين ما يلي:

    "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
    "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
    
  2. قم بتحرير القسم resources من azuredeploy.json لتضمين ما يلي:

    {
        "type": "Microsoft.Authorization/roleAssignments",
        "apiVersion": "2020-04-01-preview",
        "name": "[variables('roleAssignmentName')]",
        "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
        "properties": {
            "roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
            "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
            "scope": "[resourceGroup().id]",
            "principalType": "ServicePrincipal"
        }
    }
    
  3. حفظ القالب.

  1. ضمن تعريفات المتغير في main.bicep، أضف التالي:

    var roleAssignmentName = guid(resourceGroup().id, 'contributor')
    var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
    
  2. ضمن تعريفات الموارد، أضف:

    resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
      name: roleAssignmentName
      properties: {
        roleDefinitionId: contributorRoleDefinitionId
        principalId: userAssignedIdentity.properties.principalId
        principalType: 'ServicePrincipal'
      }
    }
    
  3. حفظ القالب.

إنشاء البرنامج النصي للتوزيع

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

  1. قم بتحرير القسم variables من azuredeploy.json لتضمين ما يلي:

    "deploymentScriptName": "CopyConfigScript"
    
  2. قم بتحرير القسم resources من azuredeploy.json لتضمين ما يلي:

    {
        "type": "Microsoft.Resources/deploymentScripts",
        "apiVersion": "2020-10-01",
        "name": "[variables('deploymentScriptName')]",
        "location": "[resourceGroup().location]",
        "kind": "AzurePowerShell",
        "dependsOn": [
            "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
            "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
        ],
        "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
            }
        }
    }
    
  3. أضف قسم propertiesإلى المورد لتعريف البرنامج النصي والقيم الأخرى المطلوبة.

    "properties": {
        "azPowerShellVersion": "3.0",
        "scriptContent": "
            Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
            $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
            $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context
            $DeploymentScriptOutputs = @{}
            $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
            $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
        ",
        "retentionInterval": "P1D"
    }
    
  4. حفظ القالب.

  1. ضمن تعريفات المتغير في main.bicep، أضف التالي:

    var deploymentScriptName = 'CopyConfigScript'
    
  2. ضمن تعريفات الموارد، أضف:

    resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: deploymentScriptName
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '${userAssignedIdentity.id}': {}
        }
      }
      dependsOn: [
        roleAssignment
        blobContainer
      ]
    }
    
  3. أضف قسم propertiesإلى المورد لتعريف البرنامج النصي والقيم الأخرى المطلوبة.

    properties: {
      azPowerShellVersion: '3.0'
      scriptContent: '''
        Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
        $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
        $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context
        $DeploymentScriptOutputs = @{}
        $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
        $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
      '''
      retentionInterval: 'P1D'
    }
    
  4. حفظ القالب.

إضافة إخراج قالب

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

بعد قسم resources من قالب ARM، أضف ناتجًا يشير إلى URI للملف كما ورد في البرنامج النصي للتوزيع.

"outputs": {
    "fileUri": {
        "type": "string",
        "value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
    }
}

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

output fileUri string = deploymentScript.properties.outputs.Uri

التحقق من القالب

يجب أن يبدو النموذج الخاص بك كما يلي:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.1",
    "apiProfile": "",
    "parameters": {},
    "variables": {
        "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
        "storageBlobContainerName": "config",
        "userAssignedIdentityName": "configDeployer",
        "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
        "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "deploymentScriptName": "CopyConfigScript"
    },
    "functions": [],
    "resources": [
        {
            "name": "[variables('storageAccountName')]",
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2019-06-01",
            "tags": {
                "displayName": "[variables('storageAccountName')]"
            },
            "location": "[resourceGroup().location]",
            "kind": "StorageV2",
            "sku": {
                "name": "Standard_LRS",
                "tier": "Standard"
            },
            "properties": {
                "encryption": {
                    "services": {
                        "blob": {
                            "enabled": true
                        }
                    },
                    "keySource": "Microsoft.Storage"
                },
                "supportsHttpsTrafficOnly": true
            }
        },
        {
            "type": "Microsoft.Storage/storageAccounts/blobServices",
            "apiVersion": "2019-04-01",
            "name": "[concat(variables('storageAccountName'), '/default')]",
            "dependsOn": [
                "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
            ]
        },
        {
            "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
            "apiVersion": "2019-04-01",
            "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
            "dependsOn": [
                "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
                "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
            ],
            "properties": {
                "publicAccess": "Blob"
            }
        },
        {
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
            "apiVersion": "2018-11-30",
            "name": "[variables('userAssignedIdentityName')]",
            "location": "[resourceGroup().location]"
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2020-04-01-preview",
            "name": "[variables('roleAssignmentName')]",
            "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
            "properties": {
                "roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
                "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
                "scope": "[resourceGroup().id]",
                "principalType": "ServicePrincipal"
            }
        },
        {
            "type": "Microsoft.Resources/deploymentScripts",
            "apiVersion": "2020-10-01",
            "name": "[variables('deploymentScriptName')]",
            "location": "[resourceGroup().location]",
            "kind": "AzurePowerShell",
            "dependsOn": [
                "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
                "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
            ],
            "identity": {
                "type": "UserAssigned",
                "userAssignedIdentities": {
                    "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
                }
            },
            "properties": {
                "azPowerShellVersion": "3.0",
                "scriptContent": "
                    Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
                    $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
                    $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context
                    $DeploymentScriptOutputs = @{}
                    $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
                    $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
                ",
                "retentionInterval": "P1D"
            }
        }
    ],
    "outputs": {
        "fileUri": {
            "type": "string",
            "value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
        }
    }
}
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
var storageBlobContainerName = 'config'
var userAssignedIdentityName = 'configDeployer'
var roleAssignmentName = guid(resourceGroup().id, 'contributor')
var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
var deploymentScriptName = 'CopyConfigScript'

resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: storageAccountName
  tags: {
    displayName: storageAccountName
  }
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
    tier: 'Standard'
  }
  properties: {
    encryption: {
      services: {
        blob: {
          enabled: true
        }
      }
      keySource: 'Microsoft.Storage'
    }
    supportsHttpsTrafficOnly: true
  }

  resource blobService 'blobServices' existing = {
    name: 'default'
  }
}

resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
  parent: storageAccount::blobService
  name: storageBlobContainerName
  properties: {
    publicAccess: 'Blob'
  }
}

resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
  name: userAssignedIdentityName
  location: resourceGroup().location
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
  name: roleAssignmentName
  properties: {
    roleDefinitionId: contributorRoleDefinitionId
    principalId: userAssignedIdentity.properties.principalId
    principalType: 'ServicePrincipal'
  }
}

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: deploymentScriptName
  location: resourceGroup().location
  kind: 'AzurePowerShell'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentity.id}': {}
    }
  }
  properties: {
    azPowerShellVersion: '3.0'
    scriptContent: '''
      Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
      $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
      $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
      $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
    '''
    retentionInterval: 'P1D'
  }
  dependsOn: [
    roleAssignment
    blobContainer
  ]
}

output fileUri string = deploymentScript.properties.outputs.Uri

إذا لم يحدث ذلك، إما أن تنسخ المثال أو تضبط القالب لمطابقة المثال.

نشر القالب

لنشر هذا القالب إلى Azure، تحتاج إلى تسجيل الدخول إلى حساب Azure الخاص بك من محطة Visual Studio Code. تأكد من تثبيت أدوات Azure CLI .

  1. في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.

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

    Screenshot of the Visual Studio Code terminal window, with the bash option shown.

  3. إذا ظهرت shell بخلاف bash ، فحدد سهم القائمة المنسدلة shell، ثم حدد Git Bash.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown shown and Git Bash Default selected.

  4. في قائمة الأصداف الطرفية، حدد bash.

    Screenshot of the Visual Studio Code terminal window, with the bash terminal selected.

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

    cd templates
    

تسجيل الدخول إلى Azure باستخدام Azure CLI

  1. في محطة Visual Studio Code الطرفية، قم بتسجيل الدخول إلى Azure عن طريق تشغيل الأمر التالي:

    az login
    
  2. في المتصفح الذي يفتح، سجل الدخول إلى حسابك في Azure.

    تعرض المحطة الطرفية لـ Visual Studio Code قائمة الاشتراكات المقترنة بهذا الحساب.

  3. في القائمة، ابحث عن الاشتراك الذي تريد استخدامه لهذا التمرين.

    إذا فاتتك القائمة من تسجيل الدخول، يمكنك استخدام قصاصة برمجية تالية لعرض الاشتراكات مرة أخرى.

    az account list --output table
    
  4. قم بتعيين الاشتراك الافتراضي لجميع أوامر Azure CLI التي تقوم بتشغيلها في جلسة العمل هذه.

    az account set --subscription "Your Subscription Name or ID"
    

لنشر هذا القالب إلى Azure، تحتاج إلى تسجيل الدخول إلى حساب Azure الخاص بك من محطة Visual Studio Code. تأكد من تثبيت أدوات Azure CLI .

  1. في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.

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

    Screenshot of the Visual Studio Code terminal window, with the bash option shown.

  3. إذا ظهرت shell بخلاف bash ، فحدد سهم القائمة المنسدلة shell، ثم حدد Git Bash.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown shown and Git Bash Default selected.

  4. في قائمة الأصداف الطرفية، حدد bash.

    Screenshot of the Visual Studio Code terminal window, with the bash terminal selected.

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

    cd templates
    

تثبيت Bicep

قم بتشغيل الأمر التالي للتأكد من أن لديك أحدث إصدار من Bicep:

az bicep install && az bicep upgrade

تسجيل الدخول إلى Azure باستخدام Azure CLI

  1. في محطة Visual Studio Code الطرفية، قم بتسجيل الدخول إلى Azure عن طريق تشغيل الأمر التالي:

    az login
    
  2. في المتصفح الذي يفتح، سجل الدخول إلى حسابك في Azure.

    تعرض المحطة الطرفية لـ Visual Studio Code قائمة الاشتراكات المقترنة بهذا الحساب.

  3. في القائمة، ابحث عن الاشتراك الذي تريد استخدامه لهذا التمرين.

    إذا فاتتك القائمة من تسجيل الدخول، يمكنك استخدام قصاصة برمجية تالية لعرض الاشتراكات مرة أخرى.

    az account list --output table
    
  4. قم بتعيين الاشتراك الافتراضي لجميع أوامر Azure CLI التي تقوم بتشغيلها في جلسة العمل هذه.

    az account set --subscription "Your Subscription Name or ID"
    

لتوزيع هذا القالب إلى Azure، قم بتسجيل الدخول إلى حساب Azure الخاص بك من المحطة الطرفية لـ Visual Studio Code. تأكد من تثبيت Azure PowerShell، وسجّل الدخول إلى الحساب نفسه الذي قام بتنشيط بيئة الاختبار المعزولة.

  1. في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.

  2. إذا كانت shell المعروضة على الجانب الأيمن من نافذة المحطة الطرفية powershell أو pwsh، فإن shell الصحيح مفتوح، ويمكنك التخطي إلى القسم التالي.

    Screenshot of the Visual Studio Code terminal window, with the pwsh option displayed in the shell dropdown list.

  3. إذا ظهرت shell بخلاف powershell أو pwsh ، فحدد سهم shell المنسدلة، ثم حدد PowerShell.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown list shown and PowerShell selected.

  4. في قائمة shell الطرفية، حدد powershell أو pwsh.

    Screenshot of the Visual Studio Code terminal window, with the PowerShell terminal selected.

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

    Set-Location -Path templates
    

تسجيل الدخول إلى Azure باستخدام Azure PowerShell

  1. في محطة Visual Studio Code الطرفية، قم بتسجيل الدخول إلى Azure عن طريق تشغيل الأمر التالي:

    Connect-AzAccount
    
  2. في المتصفح الذي يفتح، سجل الدخول إلى حسابك في Azure.

  3. احصل على معرّف الاشتراك الذي تريد استخدامه لهذا التمرين عن طريق تشغيل الأمر التالي:

    Get-AzSubscription
    

    يقع مُعرِّف الاشتراك في العمود الثاني. انسخ العمود الثاني. يبدو شيئا مثل cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. قم بتعيين الاشتراك الافتراضي لجميع أوامر Azure PowerShell التي تقوم بتشغيلها في جلسة العمل هذه.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

لتوزيع هذا القالب إلى Azure، قم بتسجيل الدخول إلى حساب Azure الخاص بك من المحطة الطرفية لـ Visual Studio Code. تأكد من تثبيت Azure PowerShell.

  1. في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.

  2. إذا كانت shell المعروضة على الجانب الأيمن من نافذة المحطة الطرفية powershell أو pwsh، فإن shell الصحيح مفتوح، ويمكنك التخطي إلى القسم التالي.

    Screenshot of the Visual Studio Code terminal window, with the pwsh option displayed in the shell dropdown list.

  3. إذا ظهرت shell بخلاف powershell أو pwsh ، فحدد سهم shell المنسدلة، ثم حدد PowerShell.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown list shown and PowerShell selected.

  4. في قائمة shell الطرفية، حدد powershell أو pwsh.

    Screenshot of the Visual Studio Code terminal window, with the PowerShell terminal selected.

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

    Set-Location -Path templates
    

تثبيت Bicep CLI

لاستخدام Bicep من Azure PowerShell، ثبّت Bicep CLI.

تسجيل الدخول إلى Azure باستخدام Azure PowerShell

  1. في محطة Visual Studio Code الطرفية، قم بتسجيل الدخول إلى Azure عن طريق تشغيل الأمر التالي:

    Connect-AzAccount
    
  2. في المتصفح الذي يفتح، سجل الدخول إلى حسابك في Azure.

  3. احصل على معرّف الاشتراك الذي تريد استخدامه لهذا التمرين عن طريق تشغيل الأمر التالي:

    Get-AzSubscription
    

    يقع مُعرِّف الاشتراك في العمود الثاني. انسخ العمود الثاني. يبدو شيئا مثل cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. قم بتعيين الاشتراك الافتراضي لجميع أوامر Azure PowerShell التي تقوم بتشغيلها في جلسة العمل هذه.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

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

من الوحدة الطرفية في Visual Studio Code، قم بتشغيل هذا الأمر لإنشاء مجموعة الموارد لهذا التمرين:

إنشاء مجموعة موارد للتمرين

resourceGroupName="learndeploymentscript_exercise_1"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_1'
New-AzResourceGroup -Location eastus -Name $resourceGroupName

إشعار

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

نشر القالب إلى Azure

تنشر التعليمات البرمجية التالية قالب ARM إلى Azure. سوف تشاهد توزيعًا ناجحًا.

نشر القالب باستخدام أوامر CLI Azure في محطة Visual Studio Code.

templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today

az deployment group create \
    --resource-group $resourceGroupName \
    --name $deploymentName \
    --template-file $templateFile

تنشر التعليمات البرمجية التالية قالب ARM إلى Azure. سوف تشاهد توزيعًا ناجحًا.

نشر القالب باستخدام أوامر CLI Azure في محطة Visual Studio Code.

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today

az deployment group create \
    --resource-group $resourceGroupName \
    --name $deploymentName \
    --template-file $templateFile

نشر التعليمات البرمجية التالية للقالب إلى Azure. سوف تشاهد توزيعًا ناجحًا.

نشر القالب باستخدام أوامر Azure PowerShell في الوحدة الطرفية.

$templateFile = 'azuredeploy.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
  -ResourceGroupName $resourceGroupName `
  -Name $deploymentName `
  -TemplateFile $templateFile

نشر التعليمات البرمجية التالية للقالب إلى Azure. سوف تشاهد توزيعًا ناجحًا.

نشر القالب باستخدام أوامر Azure PowerShell في الوحدة الطرفية.

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
  -ResourceGroupName $resourceGroupName `
  -Name $deploymentName `
  -TemplateFile $templateFile

مراجعة نتيجة القالب

بعد اكتمال التوزيع، سيتم منحك عنوان URL يشير إلى الملف الذي نسخه برنامج التوزيع البرمجي إلى تخزين كائن BLOB.

  1. استرد هذا الملف باستخدام إخراج URL من توزيع القالب للتأكد من أن البرنامج النصي للتوزيع يعمل بشكل صحيح.

    uri=$(az deployment group show --resource-group $resourceGroupName --name $deploymentName --query 'properties.outputs.fileUri.value' --output tsv)
    curl $uri
    

    يقوم الأمر بإرجاع الرمز التالي.

    {
      "environment": "production",
      "hostname": "tailwindtraders.com",
      "Logging": {
        "LogLevel": {
          "Default": "Debug"
        }
      },
      "ApplicationInsights": {
        "InstrumentationKey": ""
      },
      "AllowedHosts": "*",
      "CosmosDb": {
        "Host": "",
        "Key": "",
        "Database": "Products"
      }
    }
    
  2. يمكنك أيضًا مراجعة السجلات (والتفاصيل الأخرى حول التوزيع) من مدخل Azure أو باستخدام الأمر التالي.

    az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
    
  1. استرد هذا الملف باستخدام إخراج URL من توزيع القالب للتأكد من أن البرنامج النصي للتوزيع يعمل بشكل صحيح.

    $fileUri = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName).Outputs.fileUri.Value
    Invoke-RestMethod $fileUri
    

    يقوم الأمر بإرجاع الرمز التالي.

    environment         : production
    hostname            : tailwindtraders.com
    Logging             : @{LogLevel=}
    ApplicationInsights : @{InstrumentationKey=}
    AllowedHosts        : *
    CosmosDb            : @{Host=; Key=; Database=Products}
    
  2. يمكنك أيضًا مراجعة السجلات (والتفاصيل الأخرى حول التوزيع) من مدخل Azure أو باستخدام سطر الأوامر التالي.

    Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
    

تنظيف مجموعة الموارد

الآن، بعد أن قمت بنجاح بتوزيع قالب ARM مع برنامج نصي للتوزيع، يمكنك إزالة مجموعة الموارد التي تحتوي على كافة الموارد وتعيينات الدور التي قمت بإنشائها.

az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName