تمرين - أضِف منطقًا شرطيًا إلى قالب ARM خاصتك

مكتمل

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

لنفترض أن لديك ثلاث بيئات تحتاج إلى توزيعها: تطوير وتقسيم مرحلي وتشغيل.

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

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

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

إنشاء قالب ARM

هنا، تنشئ قالب Azure Resource Manager‏ (ARM) الذي يحدد مورد حساب التخزين.

كما يعرّف القالب معلمتين:

  • environment: اسم البيئة الحالية.
  • storageAccountName: اسم حساب التخزين.

environment يمكن أن يكون لها واحدة من ثلاث قيم: dev، staging، أو production. يزود الشرط حساب التخزين فقط عندما environment يساوي production.

  1. في Visual Studio Code، أنشئ ملفًا بالاسم condition.jsonفي الدليل نفسه الذي يحتوي على azuredeploy.json.

  2. أضِف هذه المحتويات إلى condition.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

هنا سوف تقوم بتوزيع قالب ARM، مع بناء condition، باستخدام PowerShell وحدة Az.

إتاحة بيئة التطوير

هنا، يمكنك توزيع قالب ARM في بيئة التطوير. يمكنك إجراء ذلك عن طريق تعيين معلمة القالب environment إلى dev.

لأن الشرط يزود حساب التخزين فقط عندما environment يساوي production، تتوقع ألا يزود القالب حساب التخزين. بمعنى آخر، تتوقع عملية توزيع لا تحتوي على أي موارد.

  1. إنشاء متغيّر PowerShell يحمل اسم حساب التخزين.

    $STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
    

    يجب أن تكون أسماء حسابات التخزين مميزة. يضمن الجزء Get-Random أن ينتهي حساب التخزين بسلسلة عشوائية من الأرقام.

  2. شغَّل الأمر New-AzResourceGroupDeployment التالي لتوزيع القالب إلى بيئة التطوير:

    New-AzResourceGroupDeployment `
      -TemplateFile "./condition.json" `
      -storageAccountName $STORAGE_ACCT_NAME `
      -environment dev
    

تحقق من التوزيع إلى بيئة التطوير

تذكر، أنت تتوقع أن القالب لم يزود حساب التخزين.

للتحقق من هذه الحقيقة، يمكنك تشغيل الأمر Get-AzStorageAccountللتحقق مما إذا كان اسم حساب التخزين قيد الاستخدام بالفعل.

شغَّل الأمر Get-AzStorageAccount:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

تشبه مخرجاتك ما يلي:

Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix

هذا يخبرك أن حساب التخزين لم يُزوَد بعد. تتوقع هذا لأنك لم تقم بالتوزيع بعد إلى بيئة التشغيل.

تزويد بيئة التشغيل

هنا، يتم توزيع قالب ARM إلى بيئة التشغيل، على غرار ما فعلته مع بيئة التطوير.

لتجديد المعلومات، إليك ما يبدو عليه الشرط في قالبك:

"condition": "[equals(parameters('environment'),'production')]"

لتشغيل هذا الشرط، يمكنك تعيين معلمة القالب environment إلى production.

شغَّل الأمر New-AzResourceGroupDeployment التالي لتوزيع القالب إلى بيئة التشغيل:

New-AzResourceGroupDeployment `
  -TemplateFile "./condition.json" `
  -storageAccountName $STORAGE_ACCT_NAME `
  -environment production

التحقق من التوزيع إلى بيئة التشغيل

هذه المرة، تتوقع أن يكون القالب قد زود حساب التخزين.

للتحقق من هذه الحقيقة، يمكنك إعادة تشغيل الأمر Get-AzStorageAccount للتحقق من أن اسم حساب التخزين قيد الاستخدام.

شغّل الأمر Get-AzStorageAccount التالي:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

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

تشبه مخرجاتك ما يلي:

Location Name              Type                              Kind
-------- ----              ----                              ----
westus   tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2

تخبرك هذه القيم أنه قد جرى تزويد حساب التخزين على النحو الذي تتوقعه.

على الرغم من أن هذا مثال أساسي، إلا أنك ترى كيفية التوزيع بناءً على الشرط.

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

إنشاء قالب ARM

هنا، تنشئ قالب Azure Resource Manager‏ (ARM) الذي يحدد مورد حساب التخزين.

كما يعرّف القالب معلمتين:

  • environment: اسم البيئة الحالية.
  • storageAccountName: اسم حساب التخزين.

environment يمكن أن يكون لها واحدة من ثلاث قيم: dev، staging، أو production. يزود الشرط حساب التخزين فقط عندما environment يساوي production.

  1. في Visual Studio Code، أنشئ ملفًا بالاسم condition.jsonفي الدليل نفسه الذي يحتوي على azuredeploy.json.

  2. أضِف هذه المحتويات إلى condition.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

إتاحة بيئة التطوير

هنا، يمكنك توزيع قالب ARM في بيئة التطوير. يمكنك إجراء ذلك عن طريق تعيين معلمة القالب environment إلى dev.

لأن الشرط يزود حساب التخزين فقط عندما environment يساوي production، تتوقع ألا يزود القالب حساب التخزين. بمعنى آخر، تتوقع عملية توزيع لا تحتوي على أي موارد.

  1. إنشاء متغيّر Bash يحمل اسم حساب التخزين.

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    يجب أن تكون أسماء حسابات التخزين مميزة. يضمن الجزء $RANDOM أن ينتهي حساب التخزين بسلسلة عشوائية من الأرقام.

  2. شغَّل الأمر az deployment group create التالي لتوزيع القالب إلى بيئة التطوير:

    az deployment group create \
      --template-file condition.json \
      --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
    

تحقق من التوزيع إلى بيئة التطوير

تذكر، أنت تتوقع أن القالب لم يزود حساب التخزين.

للتحقق من هذه الحقيقة، يمكنك تشغيل الأمر az storage account check-nameللتحقق مما إذا كان اسم حساب التخزين قيد الاستخدام بالفعل.

شغّل الأمر az storage account check-name التالي:

az storage account check-name --name $STORAGE_ACCT_NAME

ترى ذلك:

{
  "message": null,
  "nameAvailable": true,
  "reason": null
}

القيمة بالنسبة لـ nameAvailable هي true، مما يعني أن اسم حساب التخزين ما زال متاحًا ولم يُزود بعد. تتوقع هذا لأنك لم تقم بالتوزيع بعد إلى بيئة التشغيل.

تزويد بيئة التشغيل

هنا، يتم توزيع قالب ARM إلى بيئة التشغيل، على غرار ما فعلته مع بيئة التطوير.

لتجديد المعلومات، إليك ما يبدو عليه الشرط في قالبك:

"condition": "[equals(parameters('environment'),'production')]"

لتشغيل هذا الشرط، يمكنك تعيين معلمة القالب environment إلى production.

شغَّل الأمر az deployment group create التالي لتوزيع القالب إلى بيئة التشغيل:

az deployment group create \
  --template-file condition.json \
  --parameters storageAccountName=$STORAGE_ACCT_NAME environment=production

التحقق من التوزيع إلى بيئة التشغيل

هذه المرة، تتوقع أن يكون القالب قد زود حساب التخزين.

للتحقق من هذه الحقيقة، يمكنك إعادة تشغيل الأمر az storage account check-name للتحقق من أن اسم حساب التخزين قيد الاستخدام.

شغّل الأمر az storage account check-name التالي:

az storage account check-name --name $STORAGE_ACCT_NAME

تشبه مخرجاتك ما يلي:

{
  "message": "The storage account named tailwindsa32100 is already taken.",
  "nameAvailable": false,
  "reason": "AlreadyExists"
}

تخبرك هذه القيم أنه قد جرى تزويد حساب التخزين على النحو الذي تتوقعه.

على الرغم من أن هذا مثال أساسي، إلا أنك ترى كيفية التوزيع بناءً على الشرط.

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