Identificar as soluções de aprovisionamento para a infraestrutura de computação do Azure

Concluído

A sua empresa é fabricante de vestuário, pelo que precisa de aplicações e bases de dados para processar os produtos. A empresa também precisa de recursos de computação para executar as cargas de trabalho. A sua empresa pretende que aprovisione a computação no Azure e implemente um dimensionamento automatizado para os recursos de computação.

Criar e gerir recursos de computação de forma manual requer muito tempo de administração e torna-se numa tarefa repetitiva. Quando os administradores têm de fazer a mesma tarefa regularmente, podem ocorrer erros. Quer identificar uma forma de automatizar o aprovisionamento e gestão de recursos de computação. Tem de investigar algumas das ferramentas que pode utilizar para aprovisionar a computação no Azure.

Porquê automatizar o aprovisionamento de computação?

É muito moroso implementar uma arquitetura com muitos servidores de forma manual. Precisa de configurar o sistema operativo, instalar software, configurar esse software e aplicar atualizações. Também precisa de fazer estas tarefas para cada máquina virtual. As tarefas podem tornar-se complexas. Quando tem de realizar tarefas complexas muitas vezes, é mais fácil cometer erros.

Também poderá precisar de voltar a implementar a sua arquitetura, por exemplo, para recuperar de um ataque ou um desastre. A sua arquitetura poderá necessitar de suportar testes de software, pelo que precisa de poder voltar a implementá-la para cada ciclo de testes. Se a sua implementação manual demorar várias horas, não é ideal.

Precisa de alguma forma de automatizar a implementação de máquinas virtuais para lidar com estes problemas e dificuldades. Para cada máquina virtual, essa solução tem de ser capaz de:

  • Configurar a máquina virtual. Por exemplo, no Azure Marketplace, tem de especificar uma imagem do Azure Marketplace, um escalão, um tamanho, endereços IP e outros valores.
  • Configurar o sistema operativo para a máquina virtual. Por exemplo, se o sistema operativo incluir uma firewall, tem de conseguir configurar regras de firewall que filtrem o tráfego.
  • Instalar software. Por exemplo, poderá precisar de instalar um servidor Web ou um servidor de base de dados.
  • Aplicar atualizações. Por exemplo, poderá precisar de aplicar service packs ou correções para o sistema operativo e o software instalado.

Para reduzir a complexidade de uma configuração de implementação, crie uma arquitetura completa na forma de um script ou um ficheiro de configuração. Em seguida, implemente-a numa única operação. Dessa forma, você pode automatizar sua configuração para reduzir erros e acelerar a implantação, ajudando sua organização a se tornar mais produtiva e econômica.

Scripts personalizados

A extensão de script personalizado do Azure transfere e executa scripts em máquinas virtuais do Azure. Esta ferramenta é útil para a configuração pós-implementação, instalação de software ou qualquer outra tarefa de gestão ou configuração.

Pode ter um script do PowerShell armazenado no seu servidor de ficheiros local, no GitHub, no Armazenamento do Azure ou noutras localizações que são acessíveis à sua máquina virtual. A extensão procura o script que deve ser executado na máquina virtual. O script é transferido e, em seguida, executado na máquina virtual de destino para aplicar as alterações introduzidas pelo script. Adicione uma extensão de script personalizado a uma máquina virtual através dos modelos do Azure Resource Manager, do PowerShell ou da CLI do Azure.

Nota

Tenha cuidado se a sua tarefa de configuração ou gestão exigir um reinício. Uma extensão de script personalizado não irá prosseguir após um reinício.

A seguinte configuração de extensão de script personalizado pode ser adicionada a um modelo do Azure Resource Manager para uma máquina virtual. Utilize a propriedade fileUris para apontar para o seu ficheiro de 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"
       		 }
    	}
	}
}

Extensões do Desired State Configuration

As extensões do DSC (Desired State Configuration) permitem-lhe lidar com as configurações da sua infraestrutura que poderão necessitar de procedimentos de instalação mais complexos, como reinícios. O DSC ajuda-o a definir um estado para as suas máquinas em vez de escrever instruções manuais detalhadas sobre como atingir esse estado para cada máquina. As configurações de estado são relativamente fáceis de ler e implementar.

Ao utilizar um processador da extensão DSC, que pode definir para uma máquina virtual, pode impor os seus estados. As configurações para os seus estados podem estar localizadas em vários locais, como ao armazenamento de Blobs do Azure ou o seu armazenamento interno de ficheiros. O processador da extensão DSC obtém a configuração e implementa o estado na máquina virtual de destino. Se for necessário efetuar reinícios para uma configuração, o DSC continua a executar a configuração de estado após a conclusão dos reinícios.

O seguinte exemplo define um processador da extensão DSC para uma máquina virtual num modelo do Azure Resource Manager. A propriedade script aponta para um script de configuração no armazenamento de blobs.

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

Um servidor do Chef consegue processar 10 mil nós (máquinas) de cada vez. O servidor do Chef permite-lhe automatizar a implementação da sua infraestrutura e ajustá-la ao seu fluxo de trabalho, quer seja no local ou na cloud.

Um servidor do Chef está normalmente alojado para si e é executado como um serviço. O Chef funciona ao utilizar o servidor do Chef para gerir as suas receitas. As receitas são comandos a executar para obter uma configuração. Utilize a ferramenta de faca do Chef para implementar máquinas virtuais e aplicar simultaneamente receitas nas mesmas. Instale a ferramenta de faca na sua estação de trabalho de administrador, que é a máquina onde cria políticas e executa comandos. Em seguida, execute os comandos da sua faca na estação de trabalho de administrador.

O seguinte exemplo mostra como um comando de faca pode ser utilizado para criar uma máquina virtual no Azure. O comando aplica simultaneamente uma receita que instala um servidor Web na máquina.

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

Também pode utilizar a extensão Chef para aplicar receitas às máquinas de destino. O seguinte exemplo define uma extensão Chef para uma máquina virtual num modelo do Azure Resource Manager. Aponta para um servidor do Chef com a propriedade chef_server_url. Aponta para uma receita a executar na máquina virtual para colocá-la no estado pretendido.

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

Uma receita poderá ter um aspeto semelhante ao seguinte. A receita instala um servidor 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

O Terraform é uma ferramenta de software de infraestrutura como código open-source. Você pode criar infraestruturas usando uma linguagem criada pelo Hashicorp, chamada Hashicorp Configuration Language (HCL). Também pode utilizar JSON. O Terraform permite-lhe criar modelos de script relativamente fáceis de ler que definem o tipo de recursos a criar, independentemente do fornecedor de serviços cloud. Pode criar os seus ambientes ao utilizar diferentes fornecedores de serviços cloud, tais como o Microsoft Azure e o Amazon Web Services (AWS). Deste modo, pode garantir que os seus ambientes são idênticos em todos os fornecedores de cloud. O processo requer que instale o Terraform, localmente ou no Azure. Em seguida, poderá então utilizar o Terraform para executar um script do Terraform.

O seguinte exemplo de script do Terraform aprovisiona uma máquina virtual no 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"
    }
}

Para utilizar este script, execute o seguinte comando com o Terraform:

terraform apply

Configuração do estado de Automação do Azure

A configuração de estado de Automação do Azure é o serviço que você usa para garantir que suas configurações de DSC sejam gerenciadas corretamente e implantadas em seus nós (máquinas virtuais). A configuração de estado da Automação do Azure funciona com máquinas virtuais do Azure e máquinas locais. Também funciona com máquinas noutros fornecedores de cloud. Através de um processo intuitivo do portal do Azure, pode aplicar configurações a todos os seus nós.

Screenshot of the State configuration panel in the Azure portal.

A configuração de estado da Automação do Azure possibilita que você garanta que todas as máquinas de destino recebam as configurações corretas automaticamente. Também garante que cada máquina comunica qual é o seu estado atual e mostra se atingiu o estado pretendido. Pode enviar estas informações para relatórios e para tomadas de decisões adicionais. Você pode interagir com a configuração de estado de Automação do Azure por meio do portal do Azure ou do Azure PowerShell.

Modelos do Azure Resource Manager

Os modelos do Azure Resource Manager são ficheiros JSON que pode utilizar para definir os recursos do Azure que pretende aprovisionar no Azure através da notação de objetos. Pode definir uma infraestrutura inteira desta forma. São relativamente fáceis de ler e de trabalhar, com base na sua exposição ao JSON.

Com os modelos do Azure Resource Manager, pode garantir que as suas implementações são consistentes. Pode garantir, por exemplo, que todas as máquinas virtuais que cria têm as mesmas propriedades. Também pode incorporar extensões em máquinas virtuais num modelo para garantir que a sua configuração é a mesma. Implemente qualquer modelo do Azure Resource Manager através do Azure PowerShell, da CLI do Azure ou do portal do Azure. Teste os modelos do Azure Resource Manager antes de serem implementados. Quando testa a sua implementação, garante que o seu modelo é algo que o Azure pode implementar antes de tentar uma implementação real.

O seguinte exemplo mostra como uma máquina virtual é definida num modelo do Azure Resource Manager. Pode ver o tipo de máquina virtual, o sistema operativo e os detalhes de armazenamento, entre outros detalhes.

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