lunedì 1 ottobre 2018

Creare utenti in più server VMWare ESXi con uno script Powershell e VMWare PowerCLI

Buongiorno a tutti.
Oggi vi mostrerò come è possibile scriptare la creazione di utenti sugli host ESXi di VMWare utilizzando Powershell e PowerCLI: un modulo molto potente per amministrare la nostra infrastruttura virtuale con Powershell.


Per prima cosa è necessario aver installato la PowerCLI nella nostra powershell… altrimenti questi comandi non funzioneranno…
Vedete quindi l’articolo “Come installare la VMWare PowerCLI in Powershell” e poi tornate qui…

Una volta installata, quando lanciamo la nostra powershell, importiamo il modulo di VMWare PowerCLI:

import-module VMware.PowerCLI


E cominciamo a SCRIPTARE…

$a = "hypervisor1.mydomain.local", "hypervisor2.mydomain.local", "hypervisor3.mydomain.local"
$userN="infranagios"
$strPW="bWtw#N--yERHGy8o"
$strDescr="a simple admin user"
$HOSTCredentials = Get-Credential -Credential root
$a | foreach {
$ESXhost =$_
Connect-VIServer $ESXhost -Credential $HOSTCredentials
New-VMHostAccount -Id $userN -Password $strPW -Description $strDescr -UserAccount -Server $ESXhost
$AuthMgr = Get-View (Get-View ServiceInstance).Content.AuthorizationManager
$Entity = Get-Folder ha-folder-root | Get-View
$Perm = New-Object VMware.Vim.Permission
$Perm.entity = $Entity.MoRef
$Perm.group = $false
$Perm.principal = $userN
$Perm.propagate = $true
$Perm.roleId = "-1"
$AuthMgr.SetEntityPermissions($Entity.MoRef,$Perm)
Disconnect-VIServer $ESXhost
}



Note importanti:

In questa dimostrazione ho deciso di copiare e incollare i comandi direttamente dentro una powershell, tuttavia nulla vi vieta di crearvi un file .ps1 e modificarlo come credete.

Come vedete qui ho fatto la scelta di definire username e password in variabile prima, ma nulla vi vieta di ciclare su un file excel e di creare tutti gli utenti su tutti i server, oppure determinati utenti su determinati server... "fate vobis"... 

Ho anche fatto un video (ho scritto in inglese, per fare un esperimento) che mostra il funzionamento dello script... ve lo "embeddo" !

Ora comentiamo insieme il codice:

1- definisco i parametri validi per tutti i servers:
$a è un elenco di server, separato da virgola, su cui vogliamo creare l’utente.
$userN è lo username che vogliamo creare
$strPW è la password che verrà assegnata all’utente.
$strDescr è la descrizione che comparirà per l’utente.

2 - A questo punto richiedo le credenziali in modo sicuro con get-credentials e le memorizzo in una variabile.

3 - Quindi comincio a ciclare su tutti i servers in elenco e, per ognuno
  • Mi connetto usando le credenziali
  • Creo l’utente con il comando New-VMHostAccount (per ora è un utente senza ruolo)
  • Ottengo l’istanza del servizio di AuthorizationManager
  • Ottengo l'istanza della "Entity" del server (o root folder)
  • Creo un nuovo oggetto permissions e gli assegno il ruolo “-1” (che è quello dell’amministratore), la associo all'utente ed alla entity del server (la root folder).
  • Salvo quindi la permission dentro l’istanza del servizio AuthorizationManager
  • mi disconnetto dal server.
Quest'ultimo passaggio (la disconnessione) è molto importante, altrimenti PowerCLI cercherà di attuare i comandi impartiti su tutti i servers connessi... Tuttavia lo script così come è non potrebbe funzionare, avendo necessità di istanziare determinati oggetti del server che vogliamo gestire. 

Uno alla volta quindi!

Happy Scripting a tutti!