Automação do Azure com Windows PowerShell Desired State Configuration

Hoje em dia a automação ajuda muito e é extremamente importante para alguns processos de gestão e administrativos. Um dos principais problemas da automação é não ser aceite por todos. A tecnologia não deve ser usada para substituir ninguém mas sim para ajudar.

Vou mostrar como podem fazer automação com o Windows PowerShell. O Windows PowerShell é uma linguagem scripting da Microsoft que estava reservada aos seus produtos mas isso mudou o PowerShell agora é OpenSource e o código está disponível no GitHub em https://github.com/PowerShell/PowerShell sendo assim possível utilizar em outros sistemas operativos da Apple e Linux. Se pretendem experimentar primeiro tem de instalar o Dot NET Core (https://www.microsoft.com/net/core) e depois o Windows PowerShell (https://github.com/PowerShell/PowerShell/releases/).

O PowerShell já tem todas as funcionalidades da linha de comandos existentes na Microsoft e a vantagem de incluir as bibliotecas e funcionalidades do Dot Net que permite criar scripts de instalação, configuração e gestão de máquinas locais e remotas permitindo aceder ao registo de eventos, processos e serviços, registry e muito mais. Além dos comandos da Microsoft também inclui comandos do Linux que permite a um administrador de sistemas de Linux conseguir utilizar o Windows PowerShell, por exemplo a listagem de ficheiros. 

Exemplo da listagem de ficheiros

Os comandos de PowerShell que são invocados nos scripts têm a denominação de command-lets (cmdlets). O run-time do PowerShell também os invoca através das APIs do Windows PowerShell.

O Windows PowerShell Desired State Configuration (DSC) é um complemento ao PowerShell que inclui novos cmdlets e recursos que permitem criar scripts de instalação, configuração, manutenção ou outros autónomos como por exemplo:

  • Instalar novas aplicações e atualizações;
  • Executar Windows PowerShell scripts;
  • Gerir processos e serviços do sistema;
  • Gerir grupos e utilizadores;
  • E muito mais.

Vou demonstrar como criar uma máquina virtual no Microsoft Azure com o sistema operativo Windows Server 2012 com a funcionalidade Internet Information Services (IIS) ativada e a firewall configurada. O script também funciona com o Windows Server 2016 sendo apenas necessário mudar a imagem do sistema operativo. O script vai criar automaticamente todos os recursos necessários para a máquina como o armazenamento, rede virtual, placa de rede e Internet Protocol (IP) público. Vai instalar IIS e configurar a firewall na máquina virtual e as regras de segurança no Azure.

O Azure como plataforma é um conjunto de serviços que podem ser utilizados para alojar as suas aplicações e cargas de trabalho na nuvem. O Service Management REST API é um serviço web que recebe pedidos para criar, alterar ou configurar os serviços e passa os mesmos para o Microsoft Azure Fabric Controller que toma as decisões com base nesses pedidos e utiliza o Azure Hypervisor para criar novas máquinas virtuais, se necessário, nos data centers.

O Azure está dividido em dois modelos:

Modelo ClássicoModelo Atual
Azure Service Management (ASM) technologyAzure Resource Management (ARM) technology
É utilizado o portal clássico
https://manage.windowsazure.com
É utilizado o portal atual
https://portal.azure.com
Azure Service ManagementAzure Resource Management

Vai ser utilizado o modelo ARM que introduz uma abordagem para a gestão de recursos do Azure. As instâncias de serviço são referidas como recursos, que podem ser armazenados em grupos de recursos, onde os serviços podem ser criados, geridos, acompanhados, ou podemos excluir todos os serviços simultaneamente. Tudo isto permite uma gestão em grupo em que podem monitorizar-se os serviços em grupo e determinar a taxa de faturação ou recursos de serviços individuais.

Antes de iniciar a criação do script é necessário instalar primeiro os módulos do Azure no PowerShell, que é uma coleção de dois módulos Windows PowerShell que podem ser utilizados para gerir serviços do Azure. O módulo mais comum é Service Management este permite gerir serviços de instâncias no Azure. A seguinte imagem mostra alguns dos componentes contidos no Azure PowerShell.

Alguns dos componentes do Azure PowerShell

Pode instalar-se os módulos do Azure de duas formas:

  • Instalação Gráfica em https://Azure.microsoft.com/pt-pt/downloads/ na secção PowerShell selecione Instalação para Windows.
  • Instalação manual execute uma linha de comandos do Microsoft Windows, Windows PowerShell ou Windows PowerShell ISE para todas estas opções é recomendado executar com privilégios administrativos. Para instalar um módulo utiliza-se o cmdlet Install-Module.

Um módulo pode ser instalado de duas formas:

  • Se for instalado por uma conta de administrador o módulo fica disponível para todos os utilizadores e fica instalado em [Unidade de disco local]:\Program Files\WindowsPowerShell\Modules.
  • Se um utilizador não tiver privilégios administrativos pode instalar um módulo no seu perfil da máquina local Install-Module AureRM -Scope CurrentUser. A partir do Windows 7 os módulos ficam guardados em [Unidade de disco local]:\Users\[Nome do utilizador]\Documents\WindowsPowerShell\Modules.

Além de poder instalar módulos também pode remover e pesquisar outros cmdlets disponíveis:

  • Find-Script: Procura itens na galeria do Microsoft PowerShell (https://www.powershellgallery.com/);
  • Save-Module e Save-Script: Guardar os itens da galeria para o sistema;
  • Install-Module: Instala os itens da galeria;
  • Publish-Module e Publish-Script: Faz o upload do item para galeria;
  • Register-PSRepository : Adiciona um repositório customizado.

Para instalar os módulos execute os seguintes cmdlet, o sinal # representa um comentário no script, um conjunto de comentários inicia com <# e termina com #> todos os comentários estão em escritos em inglês para normalização do script.

# Install Azure Resource Manager module/cmdlet
Install-module AzureRM

# Install Azure Classic module/ cmdlet
Install-module Azure

Antes de iniciar a instalação execute o cmdlet Set-ExecutionPolicy que permite alterar a segurança no sistema para permitir correr scripts locais. Pode sempre ativar e desativar esta segurança em modo administrativo ou no utilizador atual.

<#
+--------------------------------------------------------------------------------------------------+
| This is a security change to your system in order to execute local scripts. |
+--------------------------------------------------------------------------------------------------+
#>
# Administrator
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
# Current User
Set-ExecutionPolicy -ExecutionPolicy ByPass -Scope CurrentUser
<#
+--------------------------------------------------------------------------------------------------+
| To reset the permissions back to default run the following. |
+--------------------------------------------------------------------------------------------------+
#>
# Administrator
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Default
# Current User
Set-ExecutionPolicy -ExecutionPolicy Default -Scope CurrentUser

Antes de iniciar qualquer operação no Azure é necessário fazer autenticação no serviço com o cmdlet Add-AzureRmAccount. Vai aparecer uma janela do navegador de internet para introduzir as credenciais da sua conta. Com a instalação concluída já pode fazer operações no Azure com PowerShell e é partir daqui que inicia o script de automação.

<#
+----------------------------------------------------------------+
| Login Azure Resource Management |
+----------------------------------------------------------------+
#>
# -- Login Azure RM --
Add-AzureRmAccount
cmdlet Add-AzureRmAccount

Após a autenticação se tiver mais que uma subscrição na sua conta é necessário selecionar a subscrição em que pretende trabalhar. Como qualquer linguagem de programação é possível definir variáveis em PowerShell e são definidas como $NomeDaVariavel = "Valor da Variável" por exemplo a identificação da sua subscrição do Azure é HDJDNHDWN então devia alterar a variável $SubscriptionId = "Your SubscriptionId" para $SubscriptionId = "HDJDNHDWN"  antes de selecionar a subscrição.

# -- Select the subscription Azure--
$SubscriptionId = “Your SubscriptionId”
Select-AzureRmSubscription -SubscriptionId $SubscriptionId
cmdlet Select-AzureRmSubscription -SubscriptionId

O primeiro serviço que temos de criar no Azure é grupo de resource group (grupo de recursos). Um resource group é um contentor de serviço numa subscrição que permite “armazenar” os vários serviços no Azure. A vantagem é que pode ter vários resource groups separados pelo tipo de serviços. Por exemplo pode ter um resource group apenas para rede virtual um para desenvolvimento e outro para produção. Isto permite separação da manutenção dos serviços. Tudo o que fizer no resource group de desenvolvimento não vai afetar a produção e pode definir administradores para gerir a rede virtual sem que tenha acesso a outros resource groups.

Num resource group é obrigatório definir a localização geográfica e a sua identificação. A Microsoft tem vários data centers espalhados pelo mundo pode consultar em https://Azure.microsoft.com/pt-pt/regions/. Normalmente eu utilizo a Europa do Norte podem existir data centers mais perto/rápido de Portugal mas esta localização geográfica raramente falhou. Para criar um resource group utiliza-se o cmdlet New-AzureRmResourceGroup.

<#
+----------------------------------------------------------------+
| Resource Group |
+----------------------------------------------------------------+
#>
# -- Set the Location --
$Location = "NorthEurope"
# -- Create Resource Group --
$ResourceGroup = "PSPTLAB"
New-AzureRmResourceGroup -Name $ResourceGroup -Location $Location -Verbose
cmdlet New-AzureRmResourceGroup

Com o resource group criado podem adicionar-se os serviços. O primeiro a ser criado é storage account (conta de armazenamento) que é uma das peças fundamentais num sistema em nuvem sem um sistema de armazenamento não consegue armazenar os registos dos serviços, disco rígido virtual de uma máquina virtual, ficheiros, e muito mais. Atenção que não existe armazenamento ilimitado até na nuvem há limites. Em todos os serviços é obrigatório a sua identificação e para grande parte a localização geográfica é também necessária. Para além destes existem vários níveis de serviços no Azure identificado por Specific Pricing Tier or Stock Keeping Unit (SKU). É necessário selecionar o tipo de armazenamento que se pretende pode consultar as diferenças em https://Azure.microsoft.com/pt-pt/pricing/details/storage/blobs/. O mais económico é Locally Redundant Storage (LRS), é este que vou utilizar. Para criar a conta utiliza-se o cmdlet New-AzureRmStorageAccount, mas antes de o fazer deve verificar-se se a identificação está a ser utilizada por outra pessoa com o cmdlet Get-AzureRmStorageAccountNameAvailability. A verificação é importante porque a identificação a conta é única em todo o universo do Azure porque pode aceder a sua conta de armazenamento por um endereço de internet.

<#
+----------------------------------------------------------------+
| Storage Account |
+----------------------------------------------------------------+
#>
# -- Set the Storage Account Name and Sku --
$StorageAccountName = "psptlabstorageaccount"
$StorageSkuName = "Standard_LRS" #Specific Pricing Tier or Stock Keeping Unit (SKU)
# -- Verify is the name is available --
# Get-AzureRmStorageAccountNameAvailability $StorageAccountName
# -- Create Storage Account --
$StorageAccount = New-AzureRmStorageAccount -ResourceGroupName $ResourceGroup -Name $StorageAccountName -SkuName $StorageSkuName -Location $Location -Verbose
cmdlet New-AzureRmStorageAccount

Com o armazenamento criado vai ser criado a rede virtual e gama de endereços para comunicação com os serviços, a placa de rede para a máquina virtual que está na rede virtual criada e o endereço público para a máquina virtual que é definido na placa de rede.