Iniciando e desligando VMs com Azure Automation
O serviço Automation do Azure fornece uma maneira para executar work flows de Powershell de maneira contínua, programada ou sob demanda. Para uma visão geral do serviço, sugiro dar uma lida na página de documentação neste link [1]. De uma forma geral o serviço funciona muito bem, mas a documentação ainda precisa melhorar e os scripts da galeria precisam ser atualizados, pois descobri que muitos não funcionam mais ou estão parcialmente implementados. Neste artigo vou demonstrar como criar uma conta de Automation e efetuar a configuração básica de credenciamento para conseguir executar operações dentro do ambiente do Azure.
Criando a conta de Automation
O primeiro passo é criar uma conta no portal. Siga para o menu Automation na lateral e a seguir clique em Create na barra inferior. Digite um nome para identificar esta conta, selecione a região onde os jobs serão executados e finalize.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img110-1024x576.png
Agora vamos precisar de duas coisas: Um certificado para autenticação e nosso id da subscription do Azure
Gerando o certificado auto-assinado
Há varias maneiras de gerar este certificado. Vou mostrar uma delas que é bem comum. Vamos gerar o certificado através do console do IIS. Abra o console do IIS e selecione Server Certificates.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img51-1024x576.png
Clique no menu à direita ou com o botão direito selecione Create Self Signed Certificate.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img61-1024x576.png
Digite um nome fácil para identificar este certificado, no meu caso “Azure Automation” e finalize.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img71-1024x576.png
Agora clique com o botão direito no certificado que você acabou de criar e selecione View.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img91-1024x576.png
Na segunda aba, clique em Copy to File e selecione o local onde este certificado será exportado. No meu caso, c:\AzureAutomation.cer e prossiga até finalizar.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img101-1024x576.png
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img111-1024x576.png
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img121-1024x576.png
Agora clique novamente com o botão direito e selecione Export. Novamente, selecione um local para salvar o arquivo. Usarei c:\AzureAutomation.pfx. Além disso, entre com uma senha para proteger este certificado.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img131-1024x576.png
Pronto! Agora podemos voltar para o Azure.
Importando o certificado para o portal
Agora precisamos importar o certificado criado no passo anterior para o portal do Azure. Para isso, clique em Settings e selecione a aba Management Certificates. Clique em upload na aba inferior e selecione o arquivo do certificado (.cer) que acabou de criar. Este é o certificado do servidor, usaremos o certificado cliente (.pfx) posteriormente.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img141-1024x576.png
Criando Assets do Runbook
Agora que temos o mecanismo de autenticação, podemos partir para as configurações do nosso runbook. Vamos criar duas variáveis nos Assets do nosso runbook. Um será a variável correspondente ao certificado e o outro da conexão. Sendo assim, quando nossos scripts forem iniciados, poderemos utilizar estes recursos para executar operações em nossas VMs. Para utilizar o certificado que acabou de criar como credenciais para executar operações no Azure, vá para Assets e clique em Add Setting na barra inferior. A seguir, selecione Add Credential.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img151-1024x576.png
Selecione Certificate e escolha um nome e descrição para identificar este novo recurso que estamos adicionando.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img161-1024x576.png
Na tela seguinte, entre com o certificado cliente (.pfx) exportado anteriormente, digite a senha de proteção e prossiga para a finalização.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img171-1024x576.png
Pronto. Já podemos utilizar certificados digitais para executar comandos de powershell nas VMs do Azure. Agora precisamos configurar uma conexão. Essa conexão nada mais é que um atalho para definir qual a Subscription que queremos trabalhar e o certificado que iremos usar, no caso, o que criamos no passo anterior. Clique em Add Setting, selecione Add Connection, selecione Azure, insira um nome e descrição e passe para o próximo passo.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img31-1024x576.png
Neste ponto, digite o nome do asset criado anteriormente, no caso, o nome dado ao certificado. Atenção: É essencial que o nome que você digitar aqui seja exatamente igual ao nome dado no passo anterior. Em SubscriptionId, digite o ID da sua assinatura. Se tiver dúvida, consulte esta informação nas configurações do portal. Lá você terá o nome, id, conta do administrador entre outras informações.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img42-1024x576.png
A partir de agora já temos o essencial para começar a executar operações. Os scripts que vou utilizar neste tutorial são bastante simples e podem ser encontrados em https://github.com/bnlf/automation [2]. Vamos utilizar o script vm-start.ps1 para ligar uma máquina e o script vm-stop.ps1 para desligar. Primeiro, abra o script para entender a lógica de funcionamento. Basicamente tudo isso só serve para executar um único comando:
Start-AzureVM
Mas para isso, precisamos de permissão para executa-lo em uma dada subscription específica. Foi para isso que fizemos todo o procedimento anterior. Basicamente estou selecionando o asset de conexão criado anteriormente aqui:
$AzureConn = Get-AutomationConnection -Name $AzureConnectionName
E o certificado aqui:
$Certificate = Get-AutomationCertificate -Name $AzureConn.AutomationCertificateName
Com isso eu consigo selecionar a assinatura onde estão as minhas máquinas aqui:
Set-AzureSubscription -SubscriptionName $AzureConnectionName -SubscriptionId $AzureConn.SubscriptionID -Certificate $Certificate Select-AzureSubscription -SubscriptionName $AzureConnectionName
Depois disso, coloco o nome da minha VM e Cloud Service em uma variavel.
$vmName = 'bnlf-demo1' $svcName = 'bnlf-demo1'
Executo o comando Get-AzureVM para pegar informações sobre essa máquina e passo tudo para uma variável chamada $vm.
$vm = Get-AzureVM -ServiceName $svcName -Name $vmName
E verifico se o status dessa VM está “StoppedDeallocated” ou “ReadyRole”. No caso do vm-start.ps1 temos:
if ( $vm.InstanceStatus -eq 'StoppedDeallocated' ) { Start-AzureVM -ServiceName $vm.ServiceName -Name $vm.Name }
Modifique o script conforme desejar. Há diversas formas de melhora-lo e ficarei feliz se você quiser compartilha-lo comigo no futuro.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img191-1024x576.png
Para importar este script para um runbook, vá para a aba Runbooks e clique em Import na aba inferior. Selecione o arquivo no seu computador e finalize.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img181-1024x576.png
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img201-1024x576.png
Agora devemos seguir 2 passos antes de colocar nosso runbook em produção. Primeiro precisamos testa-lo. Veja que você consegue editar o runbook diretamente pela interface na aba Author->Draft. Além disso, há um botão para testes no menu inferior. Clique neste botão e uma janela abrirá pedindo o nome da conexão que você deseja utilizar. Lembra deste objeto que criamos nos passos anteriores? Digite exatamente o nome da conexão conforme criado e se tudo der certo, o script executará. Em caso de erro, você verá na janela de output o erro que ocorrer durante a execução. Se configurado corretamente, sua VM deverá ligar ou desligar já durante o teste.
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img21-1024x576.png
http://www.azurekb.com.br/wp-content/uploads/2015/02/Img22-1024x576.png
Se tudo der certo, agora você só precisa publicar este runbook. Pense nisso como coloca-lo em produção. Com o runbook publicado, podemos agora agendar sua execução automática. Clique em Scheduler na aba superior e depois Link to a new schedule.
http://www.azurekb.com.br/wp-content/uploads/2015/02/img231-1024x844.png
Dê um nome, escolha a data e horário para o agendamento, o nome da conexão e finalize.
http://www.azurekb.com.br/wp-content/uploads/2015/02/img241-1024x779.png
http://www.azurekb.com.br/wp-content/uploads/2015/02/img251-1024x791.png
Neste ponto ele pergunta os parâmetros do script, você poderia ter outros tipos de parâmetros dinâmicos. O nome da conexão nem precisaria ser um parâmetro, você poderia defini-lo dentro do script e este passo não seria necessário. Mantive o script desta forma para que você possa ver como os parâmetros de entrada são definidos em um workflow de powershell.
http://www.azurekb.com.br/wp-content/uploads/2015/02/img261-1024x763.png
E por fim, no painel, visualizamos nosso agendamento.
http://www.azurekb.com.br/wp-content/uploads/2015/02/img271-1024x791.png
Repita o procedimento para o segundo script, caso necessário. E é isso pessoal. Temos o básico para executar um runbook no automation do Azure. Além da autenticação via certificados, também é possível utilizar o Azure Active Directory. Mais informações neste link [3]. Lembre-se que também é possível utilizar o Automation em seu ambiente on-premise. Do mesmo modo que utilizei certificados para me autenticar com o portal do Azure, você poderia fazer o mesmo com os servidores do seu ambiente on-premises. Não deixe de comentar.
Referências:
[1] Automation documentation. http://azure.microsoft.com/en-us/documentation/services/automation/
[2] Git Automation Scripts. https://github.com/bnlf/automation
[3] Azure Automation: Authenticating to Azure using Azure Active Directory. http://azure.microsoft.com/blog/2014/08/27/azure-automation-authenticating-to-azure-using-azure-active-directory/
*"Este documento foi originalmente publicado como http://www.azurekb.com.br/iniciando-e-desligando-vms-com-automation/ e foi reproduzido aqui para permitir que a comunidade corrija eventuais imprecisões ou forneça outras melhorias antes de atualizar a versão original deste tópico". *