Cvičení – zřízení prostředků Azure

Dokončeno

V tomto cvičení nakonfigurujete pracovní postup automatizace pro zřízení prostředků Terraformu.

Přístup k ukázkové aplikaci

V tomto cvičení vytvoříte úložiště GitHub ze šablony, která obsahuje veškerý kód pro zřizování Terraformu.

  1. Na GitHubu přejděte na hlavní stránku úložiště:

    https://github.com/MicrosoftDocs/mslearn-java-petclinic-simplified
    
  2. Nad seznamem souborů vyberte Použít tuto šablonu a pak vyberte Vytvořit nové úložiště.

    Snímek obrazovky s tlačítkem Použít tuto šablonu na hlavní stránce mslearn-java-petclinic-simplified

  3. Do pole Název úložiště zadejte jedinečný název úložiště. Nezapomeňte dodržovat zásady vytváření názvů pro úložiště GitHub.

  4. Ujistěte se, že je vybraná možnost Soukromé , a pak vyberte Vytvořit úložiště.

    Snímek obrazovky s tlačítkem Vytvořit úložiště ze šablony v okně Vytvořit nové úložiště z...

Workflow

V adresáři projektu pro úložiště, které jste vytvořili, uvidíte adresář s názvem terraform a v něm soubor s názvem main.tf.

Podívejme se na několik částí, které můžete použít k definování konfigurace modulu:

  • Zprostředkovatel: Konfigurační soubor Terraformu začíná specifikací poskytovatele. Při použití Azure zadáte poskytovatele Azure (azurerm) v bloku zprostředkovatele.
  • Terraform: Verze Terraformu, se kterou pracujete.
  • Data: Získává data z existujících služeb.
  • Místní hodnoty: Generuje nové proměnné pomocí funkcí a výrazů.
  • Prostředek: Popisuje prostředky a závislosti.
  • Modul: Reusability and complexity abstraction.

Abychom zřídili naši aplikaci a databázi, budeme muset zahrnout jenom oddíly Poskytovatel a Prostředek .

Dále otevřete soubor main.tf a prohlédněte si osnovu a komentáře:

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
  }
}

Nastavení pracovního postupu GitHub Actions pomocí Terraformu

Pojďme poskytnout přístup k vašemu účtu Azure pracovnímu postupu GitHubu.

V Azure CLI vytvořte instanční objekt spuštěním následujícího příkazu:

Důležité

Nahraďte <yourServicePrincipalName> názvem instančního objektu, který chcete použít.

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

Předchozí příkaz vrátí následující kód JSON. Zkopírujte ho pro použití v dalším kroku:

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

Tajné kódy GitHubu

Úložiště GitHub má funkci nazvanou Tajné kódy, ve které můžete ukládat citlivé informace, které Terraform používá k ověření v Azure.

Po vytvoření požadovaných ID a tajného kódu v předchozím kroku je dalším krokem v této lekci jejich přidání do úložiště tajných kódů v projektu GitHub.

V tomto cvičení je potřeba uložit následující tajné kódy:

  • AZURE_CLIENT_ID
  • AZURE_CLIENT_SECRET
  • AZURE_SUBSCRIPTION_ID
  • AZURE_TENANT_ID

Pokud chcete tajné kódy uložit, přejděte do svého forku úložiště GitHub, vyberte Nastavení a pak vyberte Tajné kódy a proměnné a pak v levém podokně vyberte Akce .

Vytvořte čtyři tajné kódy pomocí hodnot vrácených při vytváření instančního objektu.

Nezapomeňte uložit tajné kódy bez uvozovek (" ), jak je znázorněno na následujícím snímku obrazovky:

Snímek obrazovky znázorňující uložené tajné kódy v podokně Tajné kódy v části Nastavení GitHubu

Soubor pracovního postupu

V adresáři projektu je adresář s názvem .github/workflows a v něm soubor s názvem main.yml.

Soubor main.yml je pracovní postup GitHubu. Používá tajný klíč, který jste nakonfigurovali k nasazení aplikace do předplatného Azure.

V souboru pracovního postupu main.yml najdete následující obsah:

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

Tento pracovní postup provede následující akce:

  • Zkontroluje, jestli je konfigurace správně naformátovaná.
  • Vygeneruje plán pro každou žádost o přijetí změn.
  • Aktivuje konfiguraci při aktualizaci souborů v adresáři terraformu.

Poznámka:

Pracovní postup GitHub Actions můžete aktivovat také tak, že přejdete na Akce, vyberete pracovní postup Terraformu a vyberete Znovu spustit existující úlohy.

Aktivace pracovního postupu

V dalším kroku v úložišti aktivujte akci GitHubu:

  1. V integrovaném textovém editoru GitHubu nebo v editoru podle vašeho výběru upravte terraform/variables.tf následujícím způsobem:

    a. Změňte "CHANGE_ME_RESOURCE_GROUP" název požadované skupiny prostředků.
    b. Změňte "CHANGE_ME_APP_NAME" název požadované aplikace. Ujistěte se, že je název vaší aplikace jedinečný.

    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. Potvrďte provedené změny.

Ověření sestavení GitHub Actions

  1. V úložišti vyberte Akce a pak v levém podokně vyberte pracovní postup TERRAFORMu .

  2. V seznamu kroků ověřte, že se aktivovaly příkazy Terraform Init, Terraform Plan a Terraform Validate .

    Snímek obrazovky zobrazující výsledky spuštění pracovního postupu Terraformu

  3. V seznamu kroků rozbalte Terraform Použít a ověřte, že:

  • Terraform vytvořil prostředky a zobrazí adresu URL instance Azure.

  • Vaše instance aplikace Azure je veřejně dostupná.

    Snímek obrazovky znázorňující, že instance aplikace Azure je veřejně dostupná

Další kroky

V dalším cvičení použijete GitHub Actions k nasazení ukázkové aplikace Spring Boot.

Nastavení názvu aplikace a skupiny prostředků Azure

V úložišti GitHub upravte názvy prostředků Azure následujícím způsobem:

  1. V integrovaném textovém editoru GitHubu nebo v editoru podle vašeho výběru upravte terraform/variables.tf následujícím způsobem:

    a. Změňte "<CHANGE_ME_RESOURCE_GROUP>" název požadované skupiny prostředků.
    b. Změňte "<CHANGE_ME_APP_NAME>" název požadované aplikace. Ujistěte se, že je název vaší aplikace jedinečný.

    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. Potvrzení změn

Vytvoření kanálu Azure pro zřízení prostředků Terraformu

V našem projektu Azure DevOps vytvoříme dva samostatné kanály pro zřizování a sestavení a nasazení. Kanál zřizování vytvoří prostředky Azure, které se uvolní prostřednictvím kanálu build-and-deploy v pozdějším bodě.

Pojďme vytvořit první kanál zřizování:

  1. Zvolte svoji organizaci a pak vyberte Nový projekt.

  2. Zadejte následující parametry.

    Parametr Popis
    Název projektu Požadováno
    Popis Volitelné
    Viditelnost Zvolit soukromou
    Rozšířený
    Správa verzí Volba GITu
    Proces pracovní položky Zvolit základní
  3. Výběrem možnosti Vytvořit projekt vytvořte projekt a otevřete úvodní stránku.

Snímek obrazovky zobrazující nový formulář Azure Projectu

Nastavení připojení ke službě Azure Pipeline Service

Pojďme vašemu účtu Azure udělit přístup ke svému účtu Azure.

  1. V Azure DevOps otevřete stránku Připojení služby ze stránky nastavení projektu.

  2. Zvolte Vytvořit připojení služby a vyberte Azure Resource Manager a pak vyberte Další.

  3. Vyberte Instanční objekt (automatický) a pak vyberte Další.

  4. Zadejte následující parametry.

    Parametr Popis
    Úroveň oboru Výběr předplatného Azure
    Předplatné Výběr stávajícího předplatného Azure
    Skupina prostředků Pokud chcete uživatelům povolit přístup ke všem prostředkům definovaným v rámci předplatného, nechte prázdné.
    Název připojení Povinný: Název, který použijete k odkazu na toto připojení služby ve vlastnostech úlohy. Tento název není názvem vašeho předplatného Azure.
  5. Připojení vytvořte výběrem tlačítka Uložit.

Vytvoření kanálu zřizování

Důležité

Požadavky tohoto modulu vyžadují instalaci rozšíření Terraform Azure Pipelines. Pokud jste ho nenainstalovali, váš kanál se nespustí.

Po nastavení projektu a připojení k Azure budete muset vytvořit kanál Azure pro zřízení prostředků terraformu.

V Azure DevOps přejděte na svůj projekt, v nabídce vlevo vyberte Kanály a pak vyberte Vytvořit kanál.

  1. Na kartě Připojit vyberte GitHub (soubor YAML).
  2. Pokud se zobrazí výzva k autorizaci přístupu k GitHubu, zadejte své přihlašovací údaje GitHubu a schvalte přístup ke službě Azure Pipelines s požadovanými oprávněními.
  3. Na kartě Vybrat vyberte úložiště GitHub obsahující vaši šablonu.
  4. Na kartě Inventář vyberte Konfigurovat kanál.
  5. Na kartě Konfigurovat vyberte, jestli chcete použít existující soubor YAML služby Azure Pipelines.
  6. V cestě vyberte /azuredevops/provision.yml.
  7. Výběrem možnosti Pokračovat přejděte na kartu Revize a zkontrolujte kanál.

Snímek obrazovky zobrazující nový formulář kanálu Azure

Na obrazovce Kontrola kanálu YAML zkontrolujeme soubor Yaml, který použijeme k vytvoření kanálu.

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)

Pojďme se podívat na některá pole, která používáme v konfiguraci:

  • serviceConnection: Připojení služby Azure PipeLine, které jste předtím nastavili
  • command: Your Terraform workflow command: init or apply
  • backendAzure: Požadovaná pole potřebná v týmovém prostředí pro ukládání sdíleného stavu.\

Než kanál uložíte a spustíte, musíme přidat proměnnou, která vytvoří vazbu k vašemu připojení ke službě:

  1. Vyberte Proměnné (vpravo nahoře) a přidejte proměnnou s názvem "serviceConnection" s hodnotou jako názvem připojení služby.
  2. Výběrem tlačítka OK (pravý dolní roh) uložte proměnnou.

Snímek obrazovky zobrazující novou proměnnou instančního objektu

Nakonec výběrem možnosti Spustit (v pravém horním rohu) kanál uložte a spusťte.

Sledování spuštěného kanálu

V části Úlohy trasujte proces sestavení jednotlivými kroky.

Při spuštění kanálu sledujte jako první inicializační fázi Terraformu a pak druhou fázi použití přejděte z modré (spuštěné) na zelenou (dokončenou). Můžete vybrat fáze, které chcete sledovat kanál v akci.

Snímek obrazovky zobrazující spuštění nového kanálu Azure

Tip

Zkontrolujte si e-mail. Možná jste již obdrželi oznámení o sestavení s výsledky spuštění. Pomocí těchto oznámení můžete zjistit, jestli každé sestavení projde nebo selže.

Další kroky

V dalším cvičení použijete Azure Pipelines k sestavení a nasazení ukázkové aplikace Spring Boot.