التمرين - تكوين إعدادات موارد Azure

مكتمل

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

الوصول إلى نموذج التطبيق

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

  1. انتقل إلى الصفحة الرئيسية للمستودع على موقع GitHub:

    https://github.com/MicrosoftDocs/mslearn-java-petclinic-simplified
    
  2. أعلى قائمة الملفات، حدد استخدام هذا القالب، ثم حدد إنشاء مستودع جديد.

    لقطة شاشة لزر

  3. في مربع اسم المستودع، أدخل اسما فريدا لمستودعك. تأكد من اتباع إصلاح التسمية لمستودعات GitHub.

  4. تأكد من تحديد الخيار Private ، ثم حدد Create repository.

    لقطة شاشة لزر

‏‏سير العمل‬

داخل دليل المشروع للمستودع الذي أنشأته، سترى دليلا يسمى terraform ، وضمنه ملف يسمى main.tf.

لنلقِ نظرة على بعض الأقسام التي قد تستخدمها لتحديد تكوين الوحدة:

  • الموفر: يبدأ ملف تكوين Terraform بمواصفات الموفر. عند استخدام Azure، يمكنك تحديد موفر Azure (azurerm) في كتلة الموفر.
  • Terraform: إصدار Terraform الذي تعمل به.
  • البيانات: يحصل على البيانات من الخدمات الموجودة.
  • Locals: ينشئ متغيرات جديدة باستخدام الدالات والتعبيرات.
  • المورد: يصف الموارد والتبعيات.
  • الوحدة النمطية: إعادة الاستخدام والتجريد المعقد.

لتوفير التطبيق وقاعدة البيانات، سنحتاج فقط إلى تضمين قسمي الموفر والموارد.

بعد ذلك، افتح ملف main.tf وراجع المخطط التفصيلي والتعليقات:

provider "azurerm" {
  version = "=2.20.0"
  features {}
}

# Creates a resource group
resource "azurerm_resource_group" "main" {
  name     = var.resource_group
  location = var.location

  tags = {
    "Terraform" = "true"
  }
}

resource "random_password" "password" {
  length = 32
  special = true
  override_special = "_%@"
}

# Creates a MySQL server
resource "azurerm_mysql_server" "main" {
  name                              = "${azurerm_resource_group.main.name}-mysql-server"
  location                          = azurerm_resource_group.main.location
  resource_group_name               = azurerm_resource_group.main.name

  administrator_login               = "petclinic"
  administrator_login_password      = random_password.password.result

  sku_name   = "B_Gen5_1"
  storage_mb = 5120
  version    = "5.7"
  auto_grow_enabled                 = true
  backup_retention_days             = 7
  geo_redundant_backup_enabled      = false
  infrastructure_encryption_enabled = false
  public_network_access_enabled     = true
  ssl_enforcement_enabled           = true
  ssl_minimal_tls_version_enforced  = "TLS1_2"
}

# The database that your application will use
resource "azurerm_mysql_database" "main" {
  name                = "${azurerm_resource_group.main.name}_mysql_db"
  resource_group_name = azurerm_resource_group.main.name
  server_name         = azurerm_mysql_server.main.name
  charset             = "utf8"
  collation           = "utf8_unicode_ci"
}

# Enables the 'Allow access to Azure services' check box
resource "azurerm_mysql_firewall_rule" "main" {
  name                = "${azurerm_resource_group.main.name}-mysql-firewall"
  resource_group_name = azurerm_resource_group.main.name
  server_name         = azurerm_mysql_server.main.name
  start_ip_address    = "0.0.0.0"
  end_ip_address      = "0.0.0.0"
}

# Creates the plan that the service uses
resource "azurerm_app_service_plan" "main" {
  name                = "${var.application_name}-plan"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  kind                = "Linux"
  reserved            = true

  sku {
    tier = "PremiumV2"
    size = "P1v2"
  }
}

# Creates the service definition
resource "azurerm_app_service" "main" {
  name                = var.application_name
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  app_service_plan_id = azurerm_app_service_plan.main.id
  https_only          = true

  site_config {
    always_on        = true
    linux_fx_version = "JAVA|8-jre8"
  }

  # Contains application-specific environment variables
  app_settings = {
    "WEBSITES_ENABLE_APP_SERVICE_STORAGE" = "false"

    "SPRING_PROFILES_ACTIVE"     = "mysql"
    "SPRING_DATASOURCE_URL"      = "jdbc:mysql://${azurerm_mysql_server.main.fqdn}:3306/${azurerm_mysql_database.main.name}?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC"
    "SPRING_DATASOURCE_USERNAME" = "${azurerm_mysql_server.main.administrator_login}@${azurerm_mysql_server.main.name}"
    "SPRING_DATASOURCE_PASSWORD" = azurerm_mysql_server.main.administrator_login_password
  }
}

إعداد سير عمل GitHub Actions باستخدام Terraform

لنحصل على إمكانية الوصول إلى سير عمل GitHub في حساب Azure لديك.

في واجهة Azure CLI، أنشئ كيان خدمة عن طريق تشغيل الأمر التالي:

هام

استبدل <yourServicePrincipalName> باسم كيان الخدمة الذي تريد استخدامه.

az ad sp create-for-rbac --name "<yourServicePrincipalName>" --role contributor --scopes /subscriptions/<subscriptionId> --sdk-auth

يُرجع الأمر السابق ملف JSON التالي. انسخه لتستخدمه في الخطوة التالية:

{
  "clientId": "XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX",
  "clientSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "subscriptionId": "XXXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXXXX",
  "tenantId": "XXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXX",
  ...
}

البيانات السرية في GitHub

يحتوي مستودع GitHub على ميزة تسمى "بيانات سرية"، حيث يمكنك تخزين المعلومات الحساسة التي تستخدمها في Terraform للمصادقة مع خدمة Azure.

بعد إنشاء المعرّفات والبيانات السرية في الخطوة السابقة، تأتي الخطوة التالية من هذه الوحدة بإضافتها إلى مخزن "بيانات سرية" في مشروعك على GitHub.

في هذا التمرين، يجب عليك تخزين البيانات السرية التالية:

  • AZURE_CLIENT_ID
  • AZURE_CLIENT_SECRET
  • AZURE_SUBSCRIPTION_ID
  • AZURE_TENANT_ID

لتخزين الأسرار، انتقل إلى مستودع GitHub المتشعب، وحدد الإعدادات، ثم حدد الأسرار والمتغيرات، ثم حدد الإجراءات في الجزء الأيمن.

قم بإنشاء أربعة بيانات سرية باستخدام القيم التي تم إرجاعها من إنشاء "كيان الخدمة".

تأكد من تخزين البيانات السرية بدون علامات الاقتباس (" ")، كما هو موضح في لقطة الشاشة التالية:

لقطة شاشة تظهر البيانات السرية المخزنة في خانة

ملف سير العمل

يوجد داخل دليل المشروع دليل يسمى .github/workflows ، وضمنه ملف يسمى main.yml.

ملف main.yml هو سير عمل GitHub. ويستخدم البيانات السرية التي قمت بتكوينها لنشر تطبيقك على اشتراكك في Azure.

في ملف سير العمل main.yml ، ستجد المحتوى التالي:

name: TERRAFORM

on:
  push:
    branches: [ main ]
    paths:
    - 'terraform/**'
  pull_request:
    branches: [ main ]
    paths:
    - 'terraform/**'

  workflow_dispatch:
jobs:
  terraform:
    runs-on: ubuntu-latest

    env:
      ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
      ARM_CLIENT_SECRET: ${{secrets.AZURE_CLIENT_SECRET}}
      ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}

    defaults:
      run:
        working-directory: ./terraform
    steps:
      - uses: actions/checkout@v2

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1

      - name: Terraform Init
        run: terraform init

      - name: Terraform Plan
        run: terraform plan

      - name: Terraform Apply
        run: terraform apply -auto-approve

يقوم سير العمل هذا بالإجراءات التالية:

  • يتحقق مما إذا كان التكوين منسقًا بشكل صحيح.
  • ينشئ خطةً لكل طلب سحب.
  • يقوم بتشغيل التكوين عند تحديث الملفات في دليل terraform .

إشعار

يمكنك أيضا تشغيل سير عمل GitHub Actions عن طريق الانتقال إلى Actions، وتحديد سير عمل Terraform، وتحديد Re-run existing Jobs.

تشغيل مسار العمل

بعد ذلك، في المستودع الخاص بك، قم بتشغيل إجراء GitHub الخاص بك عن طريق:

  1. في محرر نص GitHub المضمن، أو في محرر من اختيارك، قم بتحرير terraform/variables.tf كما يلي:

    أ. قم بالتغيير "CHANGE_ME_RESOURCE_GROUP" إلى اسم مجموعة الموارد المقصودة.
    ب. قم بالتغيير "CHANGE_ME_APP_NAME" إلى اسم التطبيق المقصود. وتأكد من أن يكون اسم التطبيق الخاص بك مميزًا.

    variable "resource_group" {
      description = "The resource group"
      default = "CHANGE_ME_RESOURCE_GROUP"
    }
    
    variable "application_name" {
      description = "The Spring Boot application name"
      default     = "CHANGE_ME_APP_NAME"
    }
    
    variable "location" {
      description = "The Azure location where all resources in this example should be created"
      default     = "westeurope"
    }
    
  2. قم بتنفيذ Commit بتغييراتك.

التحقق من إنشاء "GitHub Actions"

  1. في المستودع الخاص بك، حدد Actions، ثم حدد سير عمل TERRAFORM في الجزء الأيمن.

  2. في قائمة الخطوات، تحقق من تشغيل Terraform Init وTerraform Plan وTerraform Validate .

    لقطة شاشة تعرض نتائج تشغيل مسار العمل

  3. في قائمة الخطوات، قم بتوسيع Terraform Apply، وتحقق مما يلي:

  • أن مسار Terraform قد أنشئ الموارد ويعرض عنوان URL مثيل Azure.

  • مثيل تطبيق Azure الخاص بك متاح للجميع.

    لقطة شاشة توضح أن مثيل تطبيق Azure متاح للجميع.

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

في التمرين التالي، ستستخدم "GitHub Actions" لتوزيع نموذج تطبيق Spring Boot.

إعداد اسم التطبيق ومجموعة موارد Azure

في مستودع GitHub، قم بتحرير أسماء موارد Azure من خلال الإجراء التالي:

  1. في محرر نص GitHub المضمن، أو في محرر من اختيارك، قم بتحرير terraform/variables.tf كما يلي:

    أ. قم بالتغيير "<CHANGE_ME_RESOURCE_GROUP>" إلى اسم مجموعة الموارد المقصودة.
    ب. قم بالتغيير "<CHANGE_ME_APP_NAME>" إلى اسم التطبيق المقصود. وتأكد من أن يكون اسم التطبيق الخاص بك مميزًا.

    variable "resource_group" {
      description = "The resource group"
      default = "<CHANGE_ME_RESOURCE_GROUP>"
    }
    
    variable "application_name" {
      description = "The Spring Boot application name"
      default     = "CHANGE_ME_APP_NAME"
    }
    
    variable "location" {
      description = "The Azure location where all resources in this example should be created"
      default     = "westeurope"
    }
    
  2. تثبيت التغييرات التي قمت بها

إنشاء Azure Pipeline لتوفير موارد Terraform الخاصة بك

في مشروع Azure DevOps، سنقوم بإنشاء خطين منفصلين للتوفير والإنشاء والنشر. إنشاء خط أنابيب توفير موارد Azure الذي سيتم إصداره عبر خط أنابيب الإنشاء والنشر في نقطة لاحقة.

لنقم بإنشاء خط أنابيب التوفير الأول:

  1. اختر مؤسستك، ثم حدد مشروع جديد.

  2. حدد المعلمات التالية.

    المعلمة ‏‏الوصف‬
    اسم المشروع المطلوب
    ‏‏الوصف‬ اختياري
    الرؤية اختر خاص
    خيارات متقدمة
    التحكم بالإصدار اختر GIT
    عملية عنصر العمل اختيار أساسي
  3. حدد إنشاء مشروع لإنشاء المشروع وفتح صفحة ترحيب.

لقطة شاشة تعرض نموذج مشروع Azure الجديد.

إعداد اتصال خدمة Azure Pipeline Service

دعونا نعطي Azure Pipeline الخاص بك الوصول إلى حساب Azure الخاص بك.

  1. في Azure DevOps، افتح صفحة اتصالات الخدمة من صفحة إعدادات المشروع

  2. اختر Create service connection وحدد Azure Resource Manager، ثم حدد Next.

  3. حدد كيان الخدمة (تلقائي)، ثم حدد التالي.

  4. حدد المعلمات التالية.

    المعلمة ‏‏الوصف‬
    مستوى النطاق تحديد اشتراك Azure
    الاشتراك حدد اشتراك Azure الحالي
    مجموعة الموارد متروكة فارغة للسماح للمستخدمين بالوصول إلى كافة الموارد المحددة داخل الاشتراك
    اسم الاتصال مطلوب. الاسم الذي ستستخدمه للإشارة إلى اتصال الخدمة هذا في خصائص المهمة. هذا الاسم ليس اسم اشتراك Azure.
  5. حدد حفظ لإنشاء الاتصال.

إنشاء خط أنابيب التوفير

هام

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

بعد إعداد المشروع والاتصال ب Azure، ستحتاج إلى إنشاء Azure Pipeline لتوفير موارد terraform الخاصة بك.

في Azure DevOps، انتقل إلى مشروعك، وحدد Pipelines في القائمة اليسرى، ثم حدد Create Pipeline.

  1. في علامة التبويب "Connect"، حدد "GitHub" (ملف YAML).
  2. إذا تمت مطالبتك بتخويل الوصول إلى GitHub، أدخل بيانات اعتماد GitHub الخاصة بك ووافق على الوصول إلى Azure Pipelines مع الامتيازات المطلوبة.
  3. في علامة التبويب "Select"، حدد GitHub Repository الذي يحتوي على القالب الخاص بك.
  4. حدد Configure pipeline في علامة التبويب Inventory .
  5. في علامة التبويب "Configure"، حدد لاستخدام "ملف YAML لخطوط أنابيب Azure الموجودة".
  6. في المسار، حدد "/azuredevops/provision.yml"
  7. حدد متابعة للانتقال إلى علامة التبويب مراجعة ومراجعة البنية الأساسية لبرنامج ربط العمليات التجارية الخاصة بك.

لقطة شاشة تعرض نموذج Azure Pipeline الجديد.

من شاشة "Review your pipeline YAML"، دعونا نفحص ملف Yaml الذي سنستخدمه لإنشاء خط الأنابيب الخاص بنا.

name: Provision Resources

trigger: none

pool:
  vmImage: 'ubuntu-latest'

steps:

# Initialize the Terraform environment and bind to your Service Connection
- task: TerraformTaskV1@0
  inputs:
    provider: 'azurerm'
    command: 'init'
    workingDirectory: $(Build.Repository.LocalPath)/terraform
    backendServiceArm: $(serviceConnection)
    backendAzureRmResourceGroupName: $(serviceConnection)
    backendAzureRmStorageAccountName: $(serviceConnection)
    backendAzureRmContainerName: 'tfstate'
    backendAzureRmKey: 'tf/terraform.tfstate'

# Apply the Terraform config and deploy to Azure
- task: TerraformTaskV1@0
  inputs:
    provider: 'azurerm'
    command: 'apply'
    workingDirectory: $(Build.Repository.LocalPath)/terraform
    backendAzureRmContainerName: 'tfstate'
    backendAzureRmKey: 'tf/terraform.tfstate'
    environmentServiceNameAzureRM: $(serviceConnection)

دعونا ننظر إلى بعض الحقول التي نستخدمها في التكوين:

  • serviceConnection: اتصال خدمة Azure PipeLine الذي أعددته مسبقا
  • الأمر: أمر سير عمل Terraform: init أو apply
  • backendAzure: الحقول المطلوبة المطلوبة في بيئة الفريق لتخزين الحالة المشتركة.\

قبل حفظ وتشغيل خط الأنابيب، نحتاج إلى إضافة المتغير الذي سيرتبط باتصال الخدمة الخاص بك:

  1. حدد المتغيرات (أعلى اليمين) وأضف متغيرا يسمى "serviceConnection" مع القيمة كاسم اتصال الخدمة.
  2. حدد OK (الزاوية السفلية اليسرى) لحفظ المتغير.

لقطة شاشة تعرض متغير Service Principal الجديد.

وأخيرا، حدد "run" (الزاوية العلوية اليمنى) لحفظ البنية الأساسية لبرنامج ربط العمليات التجارية وتشغيلها

شاهد تشغيل المسار

ضمن Jobs، تتبع عملية الإنشاء من خلال كل خطوة من الخطوات.

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

لقطة شاشة تعرض تشغيل Azure Pipeline الجديد.

تلميح

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

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

في التمرين التالي، ستستخدم Azure Pipelines لإنشاء تطبيق Spring Boot الخاص بك ونشره.