Identificare le soluzioni di provisioning per l'infrastruttura di calcolo di Azure

Completato

L'azienda produce capi di abbigliamento, quindi necessita di applicazioni e database per gestire i propri prodotti. Sono inoltre necessarie risorse di calcolo per l'esecuzione dei carichi di lavoro. L'azienda vuole effettuare il provisioning delle risorse di calcolo in Azure e configurare la scalabilità automatica per tali risorse.

La creazione e la gestione manuali delle risorse di calcolo richiedono molto tempo di amministrazione e sono attività ripetitive. Quando gli amministratori devono eseguire la stessa attività regolarmente, possono commettere errori. Si vuole identificare un modo per automatizzare il provisioning e la gestione delle risorse di calcolo. È necessario esaminare alcuni degli strumenti che è possibile usare per effettuare il provisioning di risorse di calcolo in Azure.

Perché automatizzare il provisioning delle risorse di calcolo?

L'implementazione manuale di un'architettura con numerosi server richiede molto tempo. È necessario configurare il sistema operativo, installare il software, configurare tale software e applicare gli aggiornamenti. È inoltre necessario eseguire queste attività per ogni macchina virtuale. Le attività possono diventare complesse. Quando si devono svolgere attività complesse molte volte, è facile commettere errori.

Può anche essere necessario ridistribuire l'architettura, ad esempio per eseguire il ripristino da un attacco o una situazione di emergenza. L'architettura può essere usata per il test del software e in questo caso è necessario essere in grado di ridistribuirla per ogni ciclo di test. Se la distribuzione manuale richiede diverse ore, non è una situazione ideale.

È necessario un modo per automatizzare la distribuzione delle macchine virtuali in modo da risolvere questi problemi e difficoltà. Per ogni macchina virtuale, tale soluzione deve essere in grado di:

  • Configurare la macchina virtuale. Ad esempio, in Azure è necessario specificare un'immagine da Azure Marketplace, un livello, una dimensione, indirizzi IP e altri valori.
  • Configurare il sistema operativo per la macchina virtuale. Se, ad esempio, il sistema operativo include un firewall, è necessario impostare le regole del firewall che filtrano il traffico.
  • Installare il software. Può ad esempio essere necessario installare un server Web o un server di database.
  • Applicare gli aggiornamenti. Può ad esempio essere necessario applicare Service Pack o hotfix al sistema operativo e al software installato.

Per ridurre la complessità di una configurazione della distribuzione, creare un'architettura completa sotto forma di script o file di configurazione. Eseguire quindi la distribuzione in un'unica operazione. In questo modo, è possibile automatizzare la configurazione per ridurre gli errori e accelerare la distribuzione, consentendo all'organizzazione di diventare più produttivi e convenienti.

Script personalizzati

L'estensione dello script personalizzato scarica ed esegue script nelle macchine virtuali di Azure. Questo strumento è utile per la configurazione successiva alla distribuzione, l'installazione di software o altre attività di configurazione o gestione.

È possibile avere uno script di PowerShell nel file server locale, in GitHub, in Archiviazione di Azure o in altri percorsi accessibili alla macchina virtuale. L'estensione cerca lo script che deve essere eseguito nella macchina virtuale. Lo script viene scaricato e quindi eseguito nella macchina virtuale di destinazione per applicare le modifiche introdotte dallo script. È possibile aggiungere un'estensione dello script personalizzato a una macchina virtuale tramite modelli di Azure Resource Manager, PowerShell o l'interfaccia della riga di comando di Azure.

Nota

Fare attenzione se l'attività di configurazione o gestione richiede un riavvio. Dopo il riavvio, l'estensione non continuerà a funzionare.

La configurazione dell'estensione dello script personalizzato seguente può essere aggiunta a un modello di Azure Resource Manager per una macchina virtuale. Usare la proprietà fileUris per puntare al file di script.

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

Estensioni DSC (Desired State Configuration)

Le estensioni DSC (Desired State Configuration) consentono di gestire le configurazioni nell'infrastruttura che richiedono procedure di installazione più complesse, ad esempio i riavvii. Tramite DSC è possibile definire uno stato per i computer invece di scrivere istruzioni manuali dettagliate su come ottenere tale stato per ogni computer. Le configurazioni dello stato sono relativamente facili da leggere e implementare.

Usando un gestore di estensioni DSC, che si può definire per una macchina virtuale, è possibile applicare gli stati. Le configurazioni per gli stati possono trovarsi in varie posizioni, ad esempio nell'archiviazione BLOB di Azure o nell'archiviazione file interna. Il gestore di estensioni DSC acquisisce la configurazione e implementa lo stato nella macchina virtuale di destinazione. Se sono necessari riavvii per una configurazione, DSC continua a eseguire la configurazione dello stato dopo il completamento dei riavvii.

L'esempio seguente definisce un gestore di estensioni DSC per una macchina virtuale in un modello di Azure Resource Manager. La proprietà script punta a uno script di configurazione nell'archiviazione BLOB.

{
	"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

Un server Chef è in grado di gestire 10.000 nodi (computer) alla volta. Chef consente di automatizzare la distribuzione dell'infrastruttura e adattarla al flusso di lavoro, sia in locale che nel cloud.

Un server Chef viene in genere ospitato ed eseguito come servizio. Chef funziona usando il server Chef per gestire le ricette. Le ricette sono comandi da eseguire per ottenere una configurazione. Usare lo strumento Knife di Chef per distribuire le macchine virtuali e contemporaneamente applicare ricette. È possibile installare lo strumento Knife nella workstation di amministrazione, ovvero il computer in cui si creano i criteri e si eseguono i comandi. Eseguire quindi i comandi Knife dalla workstation di amministrazione.

L'esempio seguente mostra come è possibile usare un comando Knife per creare una macchina virtuale in Azure. Il comando applica contemporaneamente una ricetta che installa un server Web nel computer.

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]"

È anche possibile usare l'estensione Chef per applicare ricette nei computer di destinazione. L'esempio seguente definisce un'estensione Chef per una macchina virtuale in un modello di Azure Resource Manager. Punta a un server Chef usando la proprietà chef_server_url. Punta a una ricetta da eseguire nella macchina virtuale per impostarla nello stato desiderato.

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

Una ricetta può essere simile a quanto segue. La ricetta installa un server Web 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 è uno strumento software di infrastruttura come codice open source. È possibile creare infrastrutture usando un linguaggio creato da Hashicorp, denominato HCL (Hashicorp Configuration Language). È anche possibile usare JSON. Terraform consente di creare modelli di script relativamente semplici da leggere che definiscono il tipo di risorse da creare, indipendentemente dal provider di servizi cloud. È possibile creare ambienti usando provider di servizi cloud diversi, ad esempio Microsoft Azure e Amazon Web Services (AWS). In questo modo è possibile assicurarsi che gli ambienti siano identici in tutti i provider di servizi cloud. Il processo richiede l'installazione di Terraform, in locale o in Azure. È quindi possibile usare Terraform per eseguire uno script.

L'esempio di script di Terraform seguente effettua il provisioning di una macchina virtuale in 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"
    }
}

Per usare lo script, eseguire il comando seguente con Terraform:

terraform apply

Servizio State Configuration di Automazione di Azure

Il servizio State Configuration di Automazione di Azure garantisce che le configurazioni DSC siano gestite correttamente e distribuite nei nodi (macchine virtuali). Questo servizio funziona sia con le macchine virtuali di Azure che con i computer locali. Funziona anche con le macchine virtuali in altri provider di servizi cloud. Tramite un processo intuitivo nel portale di Azure, è possibile applicare le configurazioni a tutti i nodi.

Screenshot of the State configuration panel in the Azure portal.

Il servizio State Configuration di Automazione di Azure consente di verificare che a tutti i computer di destinazione siano assegnate automaticamente le configurazioni corrette. Garantisce inoltre che ogni computer segnali lo stato corrente e indichi se lo stato desiderato è stato raggiunto. È possibile inviare queste informazioni a scopo di creazione di report e a supporto dei processi decisionali. È possibile interagire con il servizio State Configuration di Automazione di Azure tramite il portale di Azure o Azure PowerShell.

Modelli di Gestione risorse di Azure

I modelli di Azure Resource Manager sono file JSON che è possibile usare per definire le risorse di Azure di cui si vuole effettuare il provisioning in Azure tramite Object Notation. In questo modo è possibile definire un'intera infrastruttura. Si tratta di elementi relativamente facili da leggere e usare, in base alla familiarità con JSON.

I modelli di Azure Resource Manager garantiscono la coerenza delle distribuzioni. È possibile assicurarsi, ad esempio, che tutte le macchine virtuali create abbiano le stesse proprietà. È anche possibile incorporare le estensioni nelle macchine virtuali in un modello per assicurarsi che la configurazione sia la stessa. È possibile distribuire un modello di Azure Resource Manager tramite Azure PowerShell, l'interfaccia della riga di comando di Azure o il portale di Azure. Testare i modelli di Azure Resource Manager prima di distribuirli. Quando si testa la distribuzione, si verifica che il modello possa essere distribuito da Azure, prima di provare a eseguire una distribuzione reale.

L'esempio seguente mostra come viene definita una macchina virtuale in un modello di Azure Resource Manager. È possibile vedere, tra le altre cose, il tipo di macchina virtuale, il sistema operativo e i dettagli di archiviazione.

{
  "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]"
      }
    }
  }
}