terça-feira, 13 de janeiro de 2015

Renomeando máquinas virtuais através do PowerCLI

                 

Existem algumas situações em que um simples script pode nos ajudar a ganhar um bom tempo na execução de tarefas repetitivas. Recentemente passei por uma situação onde seria necessário renomear uma grande quantidade de máquinas virtuais. As VMs deveriam ser renomeadas tanto no inventário do vCenter como no domínio de rede. Imagina só o trabalho de ter que renomear máquina por máquina no vCenter e também no AD!?!

Procurando uma forma mais ágil para executar a atividade, acabei me deparando com alguns scripts PowerCLI, que depois de alguns testes e adaptações, me pouparam um bom tempo.

Abaixo compartilho com vocês...
- Script para renomear as VMs no inventário do vCenter

Connect-VIServer [vcenter-address] –User [vcenter-user] -Password [user-password]
$csv=Import-CSV "C:\temp\script\rename.csv"
Foreach ($vm in $csv){
Get-VM $($vm.oldname) | Set-vm -name $($vm.newname) -confirm:$false | 
}

O script acima é extremamente simples, basicamente será preciso criar um arquivo do tipo .csv contendo duas colunas, uma com o nome atual da VM no inventário do vCenter e outra com o nome desejado.


O script importa este arquivo .csv e linha por linha vai alterando o nome das respectivas VMs. 

Um detalhe importante que deve ser levado em consideração ao renomear VMs no inventário do vCenter é que os arquivos que compõem a máquina virtual, localizados no datastore onde a mesma foi alocada, não são alterados. A única maneira de fazer essa alteração é movimentando a VM para um outro datastore através de uma operação de Storage vMotion. O ideal é fazer essa operação o quanto antes, uma vez que essa diferença na nomenclatura da VM pode dificultar um futuro troubleshooting.

- Script para renomear as VMs Windows no domínio 

Connect-VIServer [vcenter-address] –User [vcenter-user] -Password [user-password]
$vms=Import-CSV "C:\temp\script\listavms.csv"
Foreach ($VM in $vms){
$VMInfo = Get-VMGuest ($vm.Name) | select-Object VmName, Hostname 
$VCName = $VMInfo.VmName
$GuestName = $VMInfo.HostName
If ($GuestName -ne $VCName) {
Write-Host "$VCName is currently $GuestName... renaming"
$renamecomputer = "netdom renamecomputer $GuestName /newname:$VCName /userd:[Domain\username] /passwordd:[domain-user-password] /force"
Invoke-VMScript -VM $VCName -GuestUser "[administrador-local]" -GuestPassword "[administrador-local-password]" -ScriptType Bat -ScriptText $renamecomputer
restart-vmguest -VM $VCName -Confirm:$false
}
}

Esse script é um pouco mais complexo que o anterior. O que ele faz é ler a lista das VMs que devem ter o nome de domínio alterado em um arquivo .csv. 

Em seguida, para cada máquina virtual da lista, o script compara o nome atual no inventário do vCenter com o hostname (nome do guest OS), e se for diferente, renomeia a máquina no domínio com o mesmo nome utilizado no inventário do vCenter. Essa era a necessidade que eu tinha, mas o bom de se trabalhar com script é que podemos adaptar o código para o que a situação exige. 

4 comentários:

  1. Ola Tiago.
    fiz um teste e funcionou de primeira.
    O script vai para caixa de ferramentas muito uteis.
    Att,
    Fabão

    ResponderExcluir
  2. Respostas
    1. É não Fabão! Tem que fazer um Storage vMotion para outro datastore para que os arquivos da VM sejam renomeados. Abraço.

      Excluir