A volte capita che sia necessario effettuare delle modifiche a delle VMs ma non si possa, o semplicemente non si voglia :-P, accedere ad una ad una per lanciare il comando.
Nel mio caso si trattava di una modifica da apportare nel corso di una operazione totalmente gestita da script e che pertanto non era possibile compiere a mano.
Ed ecco che il comando Invoke-VMScript viene meravigliosamente in aiuto in questi casi permettendo di sfruttare la potenza della hypervisor per arrivare fino dentro le macchine virtualizzate.
Per poterlo utilizzare ovviamente ci si dovrà connettere via powerCLI al vCenter dove sono ospitate le macchine sulle quali vogliamo lanciare i comandi o in alternativa lanciare il powershell classico e caricare l'Add-in di VMware con il comando "Add-Pssnapin VMware.VimAutomation.Core" (rimane ovvio che sul PC dal quale stiamo lanciando il comando, in entrambi i casi il PowerCLI di VMware debba essere installato).
In seguito basterà chiamare il comando Invoke-VMScript specificando la VM sulla quale vogliamo intervenire e indicando (tra virgolette) dopo il parametro -ScriptText il comando completo di path che verrà eseguito all'interno del sistema operativo.
E' possibile specificare che tipo di script vogliamo lanciare o meglio, il comportamento di default in caso di sistema operativo guest windows è quello di lanciare un Powershell quindi, se volessimo modificare tale comportamento saremmo costretti a specificarlo.
Infine dobbiamo fornire le credenziali per effettuare l'autenticazione al sistema operativo guest. Sarà necessario fornire un'utenza e una password che siano autorizzati ad eseguire il comando che vogliamo lanciare ;-P.
Invoke-VMScript restituirà in una graziosa cornicetta ASCII l'output del comando lanciato all'interno del sistema operativo. Se non è previsto che il comando abbia un output, o l'output possa essere troppo verboso è possibile sfruttare un piping verso il nulla :-)
Nell'esempio sotto riportato vado ad aggiungere all'interfaccia Ethernet0 di un sistema Windows Server 2012 un ulteriore indirizzo IP (10.0.0.1/24) sfruttando il comando netsh e l'utente amministrativo del sistema.
Come si può vedere, visto che il comado netsh non prevede output, ho preferito redirigere tutto a quello che in linux sarebbe il /dev/null ma che in powershell diventa out-null.
Invoke-VMScript -VM TEST-VM -ScriptText "C:\Windows\System32\netsh.exe interface ipv4 add address Ethernet0 10.0.0.1 255.0.0.0" -ScriptType BAT -GuestUser "administrator" -GuestPassword "Pa$$w0rd" | out-null
Qui sotto riporto il link al techpaper di VMware relativo al comando: