Olá Homelabers!
Hoje vou falar sobre um script em Powershell que eu usei na FIRMA para fazer o shutdown de todas as VMs do meu ambiente. Tivemos que mudar fisicamente de lugar todos os servidores do ambiente e para isso, realizamos alguns “ensaios” para garantir que tudo sairia com o planejado no dia D. No primeiro ensaio, acabei por derrubar VM por VM via console do vSphere, mas isso não é uma coisa legal de se fazer quanto você tem mais de 100 VMs em Produção no seu ambiente.
Pesquisei um pouco nas internets da vida e encontrei um script bem parecido com o que eu queria. Fiz algumas modificações e reformas para se adequar ao meu ambiente e o resultado é o código que você encontra aqui embaixo.
Esse código basicamente, lê um arquivo TXT chamado VMLIST.TXT com uma lista de todas as VMs que eu queria derrubar. O script faz um loop pelo arquivo e vai logando em um arquivo texto o resultado de cada shutdown, junto com o tempo gasto na operação. Esse log, foi bastante útil para conseguir medir o tempo exato e planejar a janela de mudança, uma vez que bastava disparar o código, abrir um Redbull (essas coisas são sempre feitas na madrugada) e esperar.
Outra curiosidade do código, é que ele tenta derrumar a VM de uma forma “graciosa”, com o comando “Shutdown-VMGuest” ou seja, dando o comando para o VMware Tools desligar o SO e depois fazer o halt da máquina. Caso não consiga, ele vai no modo bruto mesmo, com o comando “Stop-VM” tipo um DEDOFF. E importante, se você derrubar um monte de VMs de uma vez, você pode ter problemas, por isso, o código espera 30 segundos entre cada VM.
O código está bastante fácil de ser modificado, caso seja necessário cobrir alguma particularidade do seu ambiente, mas pode ser utilizado AS-IS que vai funcionar.
E mais uma coisa, eu não me responsabilizo por qualquer dano que por ventura esse código venha causar no seu ambiente OK?
Outro uso uso interessante para esse código é derrubar o seu LAB quando for necessário. Fácil, rápido e prático!
É isso ai galera! Vou ficando por aqui! Se você gostou desse post com script ou se esse script foi útil para você, deixe um comentário aqui no post.
VC
Ah(1), quase ia me esquecendo de comentar, que para executar esse script, você precisa ter o VMware PowerCLI instalado em seu computador (link para a versão 6.3)
Ahh(2), mais uma coisa que lembrei depois. A maneira mais fácil e rápida de de gerar o TXT com as suas VMs, é utilizando o RVTools conforme eu já comentei aqui e o Excel.
Script: vm-shutdown.ps1 (código disponibilizado no gist do Homelaber)
########################################################################################################## #SCRIPT PARA SHUTDOWN DE VIRTUAL MACHINES NO VCENTER # #USO: #CRIAR UM ARQUIVO TXT NO FORMATO ABAIXO COM O NOME DE VMLIST.TXT # #name #VM01 #VM01 #VM03 # #VERSÃO 1 #FALTA MELHORAR A PARTE DE LOG E CATCH DE ERRO.... ######################################################################################################### clear #função que cria um arquivo de log function LogMessage ([String[]] $messages) { $timestamp = $([DateTime]::Now).ToString() foreach ($message in $messages) { if ([string]::IsNullOrEmpty($message)) { continue } Write-Host "$message" $message = $message.Replace("`r`n", " ") $message = $message.Replace("`n", " ") Add-Content $logFile "$timestamp $message" } } #POWER OFF Add-PSSnapin VMware.VimAutomation.Core clear $vcenter="COLOCAR O NOME DO SEU VCENTER SERVER AQUI" $mycredentials = Get-Credential $scriptDir = Split-Path $MyInvocation.MyCommand.Path $logfile = $scriptDir + "\log.txt" $vmlistfile = $scriptDir + "\vmlist.txt" $waittime = 30 LogMessage "Iniciando Shudown das VMs:" Import-Csv $vmlistfile | foreach { $strNewVMName = $_.name Write-Host $strNewVMName } LogMessage "===========================================================================================" #Connect to vcenter server LogMessage "Conectando no servidor Vcenter: $vcenter ..." $success = Connect-VIServer $vcenter -Credential $mycredentials -WarningAction:SilentlyContinue if ($success) { Write-Host "Conectado com sucesso ao servidor vCenter: $vcenter" -Foregroundcolor Green } else { Write-Host "Não foi possível conectar ao servidor cCenter: $vcenter" -Foregroundcolor Red LogMessage "Não foi possível conectar ao servidor cCenter: $vcenter" exit } Write-Host "" #Import vm name from csv file LogMessage "Carregando arquivo de vms..." Import-Csv $vmlistfile | foreach { $strNewVMName = $_.name #Generate a view for each vm to determine power state $vm = Get-View -ViewType VirtualMachine -Filter @{"Name" = $strNewVMName} #If vm is powered on then VMware Tools status is checked if ($vm.Runtime.PowerState -ne "PoweredOff") { if ($vm.config.Tools.ToolsVersion -ne 0) { LogMessage "Processando VM: ++ $strNewVMName ++ ..." #Commando de Shutdown... Shutdown-VMGuest $strNewVMName -Confirm:$false LogMessage "Executando shutdown da VM ++ $strNewVMName ++ via VNMware Tools.Aguardando... (30s)" sleep 30 } else { LogMessage "Processando VM: ++ $strNewVMName ++ ..." #Commando de Shutdown... Stop-VM $strNewVMName -Confirm:$false LogMessage "Executando shutdown da VM: ++ $strNewVMName ++ via Force Stop.Aguardando... (30s)" sleep 30 } } } #Disconnect vcenter server LogMessage "Desconectando servidor Vcenter..." disconnect-viserver $vcenter -Confirm:$false sleep 5 LogMessage "Servidor Vcenter Desconectado!"
Nerd · Casado · Pai da Mariana e do João.
Profissional de TI com foco em Arquitetura de Infraestrutura e Cloud Computing
Blogueiro · Podcaster · Palestrante · Community Lover · Fotógrafo Aposentado · Old School Gamer
VMware #vExpert · #VeeamVanguard · #VMUGLeader · #VUGBrasil · #vBrownBagBrasil