Iniciando e desligando VMs com Automation – Azure Knowledge Base
February 13, 2015 October 2, 2016 Bruno Faria Automation, Powershell
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.
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.
Clique no menu à direita ou com o botão direito selecione Create Self Signed Certificate.
Digite um nome fácil para identificar este certificado, no meu caso "Azure Automation" e finalize.
Agora clique com o botão direito no certificado que você acabou de criar e selecione View.
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.
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.
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.
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.
Selecione Certificate e escolha um nome e descrição para identificar este novo recurso que estamos adicionando.
Na tela seguinte, entre com o certificado cliente (.pfx) exportado anteriormente, digite a senha de proteção e prossiga para a finalização.
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.
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.
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:
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:
E o certificado aqui:
Com isso eu consigo selecionar a assinatura onde estão as minhas máquinas aqui:
Set-AzureSubscription -SubscriptionName
$AzureConnectionName -SubscriptionId
$AzureConn.SubscriptionID -Certificate $Certificate
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.
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.
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.
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.
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.
Dê um nome, escolha a data e horário para o agendamento, o nome da conexão e finalize.
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.
E por fim, no painel, visualizamos nosso 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.
[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"
Parabéns pelo post… Muito claro e objetivo…
Arthur Bovolon says:
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?
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.
Entendi. Ficou claro agora… Você faz uma validação entre o script e o Azure.
February 19, 2015 at 11:43
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? =/
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"
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.
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?
November 18, 2015 at 16:35
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.