Identyfikowanie rozwiązań do aprowizacji dla infrastruktury obliczeniowej platformy Azure

Ukończone

Twoja firma jest producentem odzieży, który potrzebuje aplikacji i baz danych do obsługi swoich produktów. Firma potrzebuje także zasobów obliczeniowych, aby uruchamiać swoje obciążenia. Firma chce aprowizować zasoby obliczeniowe na platformie Azure i wdrożyć zautomatyzowane skalowanie zasobów obliczeniowych.

Tworzenie zasobów obliczeniowych i zarządzanie nimi ręcznie wymaga dużo czasu na administrację i staje się zadaniem powtarzalnym. Gdy administratorzy muszą regularnie wykonywać to samo zadanie, mogą zdarzyć się błędy. Chcesz określić sposób zautomatyzowania aprowizacji i zarządzania zasobami obliczeniowymi. Musisz zapoznać się z kilkoma narzędziami, których można używać do aprowizowania zasobów obliczeniowych na platformie Azure.

Dlaczego warto zautomatyzować aprowizowanie zasobów obliczeniowych?

Ręczna implementacja architektury z wieloma serwerami zajmuje dużo czasu. Trzeba skonfigurować system operacyjny, zainstalować oprogramowanie, skonfigurować to oprogramowanie i zastosować aktualizacje. Ponadto musisz wykonać te zadania dla każdej maszyny wirtualnej. Zadania mogą stać się złożone. Wykonując złożone zadania wielokrotnie, można łatwo popełnić błędy.

Może być również konieczne ponowne wdrożenie architektury, na przykład w celu odzyskania sprawności po ataku lub awarii. Architektura może wymagać obsługi testowania oprogramowania, dlatego musisz mieć możliwość jego ponownego wdrożenia w każdym cyklu testowania. Jeśli wdrożenie ręczne zajmuje kilka godzin, nie jest idealne.

Aby uporać się z tymi problemami i trudnościami, potrzebujesz jakiegoś sposobu na zautomatyzowanie wdrażania maszyn wirtualnych. W przypadku każdej maszyny wirtualnej takie rozwiązanie musi umożliwiać:

  • Konfigurowanie maszyny wirtualnej. Na przykład na platformie Azure musisz określić obraz z witryny Azure Marketplace, warstwę, rozmiar, adresy IP i inne wartości.
  • Konfigurowanie systemu operacyjnego dla maszyny wirtualnej. Na przykład jeśli system operacyjny zawiera zaporę, musisz mieć możliwość ustawienia reguł zapory filtrujących ruch.
  • Instalowanie oprogramowania. Na przykład może być konieczne zainstalowanie serwera internetowego lub serwera bazy danych.
  • Stosowanie aktualizacji. Na przykład może być konieczne zastosowanie dodatków Service Pack lub poprawek do systemu operacyjnego i zainstalowanego oprogramowania.

Aby uprościć konfigurację wdrożenia, utwórz kompletną architekturę w postaci skryptu lub pliku konfiguracji. Następnie wdróż ją w ramach jednej operacji. W ten sposób możesz zautomatyzować konfigurowanie, aby zmniejszyć liczbę błędów i przyspieszyć wdrażanie. Pozwoli to zwiększyć wydajność i ograniczyć koszty w organizacji.

Skrypty niestandardowe

Rozszerzenie niestandardowego skryptu służy do pobierania i uruchamiania skryptów na maszynach wirtualnych platformy Azure. To narzędzie jest przydatne w przypadku konfigurowania po wdrożeniu, instalowania oprogramowania lub każdego innego zadania związanego z konfigurowaniem lub zarządzaniem.

Skrypt programu PowerShell może znajdować się na lokalnym serwerze plików, w repozytorium GitHub, w usłudze Azure Storage lub w innych lokalizacjach dostępnych dla maszyny wirtualnej. Rozszerzenie szuka skryptu, który powinien zostać uruchomiony na maszynie wirtualnej. Skrypt jest pobierany, a następnie wykonywany na docelowej maszynie wirtualnej w celu zastosowania zmian wprowadzonych przez skrypt. Rozszerzenie niestandardowego skryptu można dodać do maszyny wirtualnej za pomocą szablonów usługi Azure Resource Manager, programu PowerShell lub interfejsu wiersza polecenia platformy Azure.

Uwaga

Zachowaj ostrożność, jeśli zadanie konfigurowania lub zarządzania wymaga ponownego uruchomienia. Rozszerzenie niestandardowego skryptu nie będzie dalej działać po ponownym uruchomieniu.

Poniższą konfigurację rozszerzenia niestandardowego skryptu można dodać do szablonu usługi Azure Resource Manager dla maszyny wirtualnej. Użyj właściwości fileUris, aby wskazać plik skryptu.

{
    "apiVersion": "2019-06-01",
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "name": "[concat(variables('virtual machineName'),'/', 'InstallWebServer')]",
    "location": "[parameters('location')]",
    "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/',variables('virtual machineName'))]"
    ],
    "properties": {
        "publisher": "Microsoft.Compute",
        "type": "CustomScriptExtension",
        "typeHandlerVersion": "1.7",
        "autoUpgradeMinorVersion":true,
        "settings": {
            "fileUris": [
                "https://your-potential-file-location.com/your-script-file.ps1"
            ],
            "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File your-script-file.ps1"
             }
        }
    }
}

Rozszerzenia Desired State Configuration

Rozszerzenia Desired State Configuration (DSC) umożliwiają radzenie sobie z konfiguracjami w infrastrukturze, które mogą wymagać bardziej złożonych procedur instalacji, takich jak ponowne uruchomienie. Rozszerzenie DSC ułatwia zdefiniowanie stanu dla maszyn, zamiast ręcznego pisania szczegółowych instrukcji, jak osiągnąć ten stan w przypadku każdej maszyny. Konfiguracje stanu są stosunkowo łatwe do odczytania i zaimplementowania.

Korzystając z procedury obsługi rozszerzenia DSC, którą można zdefiniować dla maszyny wirtualnej, możesz wymuszać stany. Konfiguracje stanów mogą znajdować się w różnych miejscach, takich jak usługa Azure Blob Storage lub wewnętrzny magazyn plików. Procedura obsługi rozszerzenia DSC pobiera konfigurację i implementuje stan na docelowej maszynie wirtualnej. Jeśli konfiguracja wymaga ponownego uruchomienia, po jego zakończeniu rozszerzenie DSC kontynuuje wykonywanie konfiguracji stanu.

W poniższym przykładzie zdefiniowano procedurę obsługi rozszerzenia DSC dla maszyny wirtualnej w szablonie usługi Azure Resource Manager. Właściwość script wskazuje skrypt konfiguracji w usłudze Blob Storage.

{
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "name": "Microsoft.Powershell.DSC",
    "apiVersion": "2018-06-30",
    "location": "your-region",
    "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/', parameters('virtual machineName'))]"
    ],
    "properties": {
        "publisher": "Microsoft.Powershell",
        "type": "DSC",
        "typeHandlerVersion": "2.77",
        "autoUpgradeMinorVersion": true,
        "settings": {
            "configuration": {
                "url": "https://demo.blob.core.windows.net/iisinstall.zip",
                "script": "IisInstall.ps1",
                "function": "IISInstall"
            }
        },
        "protectedSettings": {
            "configurationUrlSasToken": "odLPL/U1p9lvcnp..."
        }
    }
}

Chef

Serwer Chef może obsługiwać 10 000 węzłów (maszyn) jednocześnie. Rozwiązanie Chef umożliwia zautomatyzowanie wdrażania infrastruktury i dopasowanie jej do przepływu pracy, zarówno w środowisku lokalnym, jak i w chmurze.

Serwer Chef jest zwykle hostowany dla Ciebie i uruchamiany jako usługa. Rozwiązanie Chef działa, zarządzając przepisami przy użyciu serwera Chef. Przepisy to polecenia, które należy uruchomić w celu osiągnięcia konfiguracji. Użyj narzędzia noża rozwiązania Chef, aby wdrożyć maszyny wirtualne i jednocześnie zastosować do nich przepisy. Narzędzie noża instaluje się na stacji roboczej administratora, czyli na komputerze, na którym tworzysz zasady i wykonujesz polecenia. Następnie uruchom polecenia noża na stacji roboczej administratora.

Poniższy przykład pokazuje, jak można użyć polecenia noża do utworzenia maszyny wirtualnej na platformie Azure. Polecenie jednocześnie stosuje przepis instalujący serwer internetowy na maszynie.

knife azurerm server create `
    --azure-resource-group-name rg-chefdeployment `
    --azure-storage-account store `
    --azure-vm-name chefvm `
    --azure-vm-size 'Standard_DS2_v2' `
    --azure-service-location 'eastus' `
    --azure-image-reference-offer 'WindowsServer' `
    --azure-image-reference-publisher 'MicrosoftWindowsServer' `
    --azure-image-reference-sku '2016-Datacenter' `
    --azure-image-reference-version 'latest' `
    -x myuser `
    -P yourPassword `
    --tcp-endpoints '80,3389' `
    --chef-daemon-interval 1 `
    -r "recipe[webserver]"

Za pomocą rozszerzenia Chef możesz również stosować przepisy do maszyn docelowych. W poniższym przykładzie zdefiniowano rozszerzenie Chef dla maszyny wirtualnej w szablonie usługi Azure Resource Manager. Wskazuje ona serwer Chef, używając właściwości chef_server_url. Wskazuje także przepis, który należy uruchomić na maszynie wirtualnej, aby umieścić ją w żądanym stanie.

{
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "name": "[concat(variables('virtual machineName'),'/', variables('virtual machineExtensionName'))]",
  "apiVersion": "2015-05-01-preview",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', variables('virtual machineName'))]"
  ],
  "properties": {
    "publisher": "Chef.Bootstrap.WindowsAzure",
    "type": "LinuxChefClient",
    "typeHandlerVersion": "1210.12",
    "settings": {
      "bootstrap_options": {
        "chef_node_name": "chef_node_name",
        "chef_server_url": "chef_server_url",
        "validation_client_name": "validation_client_name"
      },
      "runlist": "recipe[your-recipe]",
      "validation_key_format": "validation_key_format",
      "chef_service_interval": "chef_service_interval",
      "bootstrap_version": "bootstrap_version",
      "bootstrap_channel": "bootstrap_channel",
      "daemon": "service"
    },
    "protectedSettings": {
      "validation_key": "validation_key",
      "secret": "secret"
    }
  }
}

Przepis może wyglądać podobnie do poniższego. Przepis instaluje serwer internetowy IIS.

#install IIS on the node.
powershell_script 'Install IIS' do
     action :run
     code 'add-windowsfeature Web-Server'
end

service 'w3svc' do
     action [ :enable, :start ]
end

Terraform

Terraform to narzędzie open source do tworzenia infrastruktury jako kodu. Infrastruktury można tworzyć przy użyciu języka konfiguracji Hashicorp (HCL, Hashicorp Configuration Language). Ten język został stworzony przez firmę Hashicorp. Umożliwia również korzystanie z formatu JSON. Narzędzie Terraform umożliwia tworzenie stosunkowo łatwych do odczytania szablonów skryptów, które definiują typ zasobów do utworzenia, niezależnie od dostawcy usług w chmurze. Środowiska można tworzyć, korzystając z różnych dostawców usług w chmurze, takich jak Microsoft Azure i Amazon Web Services (AWS). Dzięki temu można zagwarantować, że środowiska będą identyczne u różnych dostawców chmury. Proces wymaga zainstalowania narzędzia Terraform lokalnie lub na platformie Azure. Następnie za pomocą narzędzia Terraform wykonuje się skrypt Terraform.

Poniższy przykładowy skrypt Terraform aprowizuje maszynę wirtualną na platformie Azure:

# Configure the Microsoft Azure as a provider
provider "azurerm" {
    subscription_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    client_id       = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    client_secret   = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    tenant_id       = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

# Create a resource group
resource "azurerm_resource_group" "myterraformgroup" {
    name     = "myResourceGroup"
    location = "eastus"

    tags = {
        environment = "Terraform Demo"
    }
}
# Create the virtual machine
resource "azurerm_virtual_machine" "myterraformvirtual machine" {
    name                  = "myvirtual machine"
    location              = "eastus"
    resource_group_name   = "${azurerm_resource_group.myterraformgroup.name}"
    network_interface_ids = ["${azurerm_network_interface.myterraformnic.id}"]
    virtual machine_size               = "Standard_DS1_v2"

    storage_os_disk {
        name              = "myOsDisk"
        caching           = "ReadWrite"
        create_option     = "FromImage"
        managed_disk_type = "Premium_LRS"
    }

    storage_image_reference {
        publisher = "Canonical"
        offer     = "UbuntuServer"
        sku       = "16.04.0-LTS"
        version   = "latest"
    }

    os_profile {
        computer_name  = "myvirtual machine"
        admin_username = "azureuser"
    }

    os_profile_linux_config {
        disable_password_authentication = true
        ssh_keys {
            path     = "/home/azureuser/.ssh/authorized_keys"
            key_data = "ssh-rsa AAAAB3Nz{snip}hwhaa6h"
        }
    }

    boot_diagnostics {
        enabled     = "true"
        storage_uri = "${azurerm_storage_account.mystorageaccount.primary_blob_endpoint}"
    }

    tags = {
        environment = "Terraform Demo"
    }
}

Aby użyć tego skryptu, uruchom następujące polecenie przy użyciu narzędzia Terraform:

terraform apply

Azure Automation State Configuration

Azure Automation State Configuration to usługa, z której korzystasz, aby upewnić się, że konfiguracje DSC są prawidłowo zarządzane i wdrażane w węzłach (na maszynach wirtualnych). Usługa Azure Automation State Configuration działa zarówno na maszynach wirtualnych platformy Azure, jak i na maszynach lokalnych. Działa również na maszynach innych dostawców chmury. Za pośrednictwem intuicyjnego procesu witryny Azure Portal możesz zastosować konfiguracje do wszystkich węzłów.

Zrzut ekranu przedstawiający panel Konfiguracja stanu w witrynie Azure Portal.

Usługa Azure Automation State Configuration umożliwia upewnienie się, że do wszystkich maszyn docelowych automatycznie przypisano odpowiednie konfiguracje. Gwarantuje również, że każda maszyna zgłasza swój bieżący stan i pokazuje, czy osiągnęła żądany stan. Te informacje można wysyłać w celu raportowania i podejmowania dalszych decyzji. Z usługi Azure Automation State Configuration można korzystać za pośrednictwem witryny Azure Portal lub usługi Azure PowerShell.

Szablony usługi Azure Resource Manager

Szablony usługi Azure Resource Manager to pliki JSON umożliwiające definiowanie zasobów platformy Azure, które mają być aprowizowane na platformie Azure za pomocą notacji obiektu. W ten sposób można zdefiniować całą infrastrukturę. Są one stosunkowo łatwe do odczytywania i użytkowania, w zależności od wrażliwości na dane JSON.

Korzystając z szablonów usługi Azure Resource Manager, możesz mieć pewność, że wdrożenia są spójne. Możesz na przykład zapewnić jednakowe właściwości dla wszystkich tworzonych maszyn wirtualnych. Możesz również osadzać w szablonie rozszerzenia maszyn wirtualnych, aby zapewnić ich jednakową konfigurację. Szablon usługi Azure Resource Manager można wdrożyć za pomocą usługi Azure PowerShell, interfejsu wiersza polecenia platformy Azure lub witryny Azure Portal. Przetestuj szablony usługi Azure Resource Manager przed ich wdrożeniem. Testując wdrożenie, upewniasz się przed podjęciem próby rzeczywistego wdrożenia, że szablon jest czymś, co platforma Azure może wdrożyć.

W poniższym przykładzie pokazano sposób definiowania maszyny wirtualnej w szablonie usługi Azure Resource Manager. Między innymi można sprawdzić typ maszyny wirtualnej, system operacyjny i szczegóły jego magazynu.

{
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2018-10-01",
  "name": "[variables('virtual machineName')]",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
  ],
  "properties": {
    "hardwareProfile": {
      "virtual machinesize": "Standard_A2"
    },
    "osProfile": {
      "computerName": "[variables('virtual machineName')]",
      "adminUsername": "[parameters('adminUsername')]",
      "adminPassword": "[parameters('adminPassword')]"
    },
    "storageProfile": {
      "imageReference": {
        "publisher": "MicrosoftWindowsServer",
        "offer": "WindowsServer",
        "sku": "[parameters('windowsOSVersion')]",
        "version": "latest"
      },
      "osDisk": {
        "createOption": "FromImage"
      },
      "dataDisks": [
        {
          "diskSizeGB": 1023,
          "lun": 0,
          "createOption": "Empty"
        }
      ]
    },
    "networkProfile": {
      "networkInterfaces": [
        {
          "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
        }
      ]
    },
    "diagnosticsProfile": {
      "bootDiagnostics": {
        "enabled": true,
        "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))).primaryEndpoints.blob]"
      }
    }
  }
}