mercoledì 23 marzo 2016

Invocare gli script dentro le VM

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:

lunedì 21 marzo 2016

Powershell da task manager di windows

Ok... ore che lavori al tuo script in powershell lo provi, lo "debugghi", lo riprovi ancora un'ultima volta e ora... arriva il momento di vederlo camminare con le sue "gambette" :-D

Lo affidi alle amorevoli cure del task manager di Windows!

Ok ma come si fa?

Sfortunatamente non si può operare allo stesso modo che con gli script in DOS ma è necessario specificare il path dell'interprete, che nel nostro caso è ovviamente powershell.
Una volta fatto questo e solo nei parametri andremo ad indicare il percorso completo dello script (meglio se tra virgolette per evitare problemi con gli eventuali spazi).

Fino a qui tutto chiaro ma sfortunatamente ancora non sufficiente...

Infatti dobbiamo spiegare a powershell che dovrà trattare quello che gli abbiamo dato in pasto nei parametri come un comando e non come un oggetto.

Per fare questo basta anteporre al percorso dello script un "&" ovviamente con l'accortezza di racchiudere tutto tra virgolette nel caso si inseriscano degli spazi.


Quindi per ricapitolare e rendere facile il copia incolla :-P

Nella riga del comando metteremo il path per l'eseguibile di powershell:

C:\Windows\system32\windowspowershell\v1.0\powershell.exe

Mentre nella riga dei parametri, con tutte le virgolette del caso, piazzeremo un "&" e poi il percorso completo dello script in powershell che intendiamo eseguire tramite lo schedulatore di windows:

"& "C:\test.ps1""

Solo per completezza vi ricordo di controllare anche i permessi con i quali fate eseguire lo script allo schedulatore e di impostare correttamente il fatto che possa essere eseguito anche quando l'utente non è loggato.