Iniciando e desligando VMs com 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.

Automation

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.

Gerando certificado auto assinado

Clique no menu à direita ou com o botão direito selecione Create Self Signed Certificate.

Gerando certificado auto assinado

Digite um nome fácil para identificar este certificado, no meu caso “Azure Automation” e finalize.

Gerando certificado auto assinado

Agora clique com o botão direito no certificado que você acabou de criar e selecione View.

Gerando certificado auto assinado

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.

Gerando certificado auto assinado

Gerando certificado auto assinado

Gerando certificado auto assinado

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.

Gerando certificado auto assinado

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.

Upload de certificado

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.

Configurando Assets

Selecione Certificate e escolha um nome e descrição para identificar este novo recurso que estamos adicionando.

Configurando Assets

Na tela seguinte, entre com o certificado cliente (.pfx) exportado anteriormente, digite a senha de proteção e prossiga para a finalização.

Configurando Assets

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.

Img3

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.

Criando Conexão

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.

Ps1 Script

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.

Import Runbook

Importando Runbooks

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.

Editando Runbook

Editando Runbook

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.

Criando Agendamento

Dê um nome, escolha a data e horário para o agendamento, o nome da conexão e finalize.

Criando Agendamento

Criando Agendamento

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.

Criando Agendamento

E por fim, no painel, visualizamos nosso agendamento.

Criando Agendamento

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/

9 thoughts on “Iniciando e desligando VMs com Automation

  1. Bom dia Bruno!
    Cara, excelente artigo! Parabéns pelo trabalho!

    Uma duvida. Esse certificado, eu devo gerar em cada maquina que eu queira automatizar? Ou gero um único certificado para rodar esse script em qualquer maquina?

    Abraço!

    1. O certificado é único. Não precisa gerar toda hora. Você registra o raiz (.cer) no portal do azure lá em configurações e utiliza o .pfx para o powershell. Pode usar o mesmo .pfx para todos os scripts. Esse é um método relativamente fácil de conseguir executar operações no Azure sem precisar se logar e etc. Veja que estou executando operações no Azure e não via sessão remota de powershell na máquina. Então eu consigo fazer operações como ligar ou desligar uma máquina, mudar o sizing, verificar logs, etc etc. São operações de Azure. Para se logar na máquina e executar alguma operação via powershell remoto já são outros 500.

  2. Bruno, fiz todo passo-a-passo e revisei, mas quando testo ele da o erro:
    “Could not retrieve ‘System.Collections.Hashtable.AutomationCertificateName’ certificate asset. Check that you created this first in the Automation service.”

    Sendo que configurei o certificado em Assets igual ao descrito, mas parece que o script não o reconheceu.

    Sabe o que pode ser? =/

    Abraço!

    1. São dois assets que você precisa criar no automation. Um é da conexão e outro é do certificado. O objeto conexão, que eu chamei de Default Connection, ele precisa referenciar o certificado. O que me parece é que essa referência está errada. Entra no asset de conexão que você criou e verifique o nome do “AUTOMATIONCERTIFICATENAME”. Esse tem que apontar para o nome exato que você criou no asset. No meu caso era “Default Certificate”

      1. BINGO!!!
        Era isso mesmo Bruno. Não sei porque motivo, eu havia colocado “AzureAutomation”. Agora funcionou certinho!
        Agora da pra começar a brincar.
        Valeu pelo tutorial e ajuda complementar.

        Abraço!!!

  3. Olá, ta de parabens pela dica, me ajudou muito.

    Eu estou com uma dúvida, se puder me ajudar eu agradeço muito.

    Minha VM esta localizada no centro sul dos estados unidos. Eu estou localizado no PARANÁ. Configurei minha VM como UTC-03:00 BRASILIA.

    Os agendamentos feitos com o Automation serão executados em qual horário? No horário da VM ou no horário do local onde ela esta geograficamente?

    Obrigado.

    1. Olá Guilherme. Qualquer tarefa no azure, incluindo a plataforma do automation, opera no horário UTC. Isto é, duas horas de diferença à frente por conta do horário de verão. Porém, quando você cria o agendamento pelo navegador, ele converte a hora que você coloca (hora do navegador) para UTC depois que você aperta ok. Então se você colocasse a hora 16:30 por exemplo, ele converteria para 18:30, mas executaria às 16:30 do nosso horário.

Leave a Reply

Your email address will not be published. Required fields are marked *