Domanda

Ho una piccola sceneggiatura PowerShell che viene utilizzata per chiudere le mie macchine virtuali in caso di interruzione di corrente estesa. Prende un oggetto VM specifico e costringe un arresto.

Function DirtyShutdown
{ param([VMware.VimAutomation.ViCore.Impl.V1.Inventory.VirtualMachineImpl]$VM )
$VM | Stop-VM -Confirm:$false
}

Vorrei accelerare questo processo usando il comando start-job per eseguire tutte queste attività in parallelo. Ho provato a usare diverse varianti, tra cui le seguenti che credo siano corrette.

Start-Job -InputObject $VM -ScriptBlock{ $input | Shutdown-VMGuest -Confirm:$false }

Sulla base dell'uscita del lavoro di ricezione, appare il problema è lo scatto in uso (aggiunto prima che venga chiamata la funzione sopra) non viene caricata nel contesto di Start-Job.

Qual è la sintassi corretta per far sì che ciò accada?

È stato utile?

Soluzione

Mentre apprezzo il desiderio di utilizzare il sottosistema di lavoro di PowerShell V2 per questo compito, si noti che vCenter ha un sistema di lavoro integrato di cui puoi trarre vantaggio qui. La maggior parte dei cmdlet Powercli che eseguono una modifica al tuo ambiente hanno un parametro RunAsync. Per sapere quali, esegui questo codice PowerShell:

get-help * -parameter runasync

Il parametro RunAsync prenderà i tuoi comandi e li metterebbe in coda in vCenter. Il cmdlet restituirà un oggetto attività e quindi restituirà immediatamente il controllo allo script.

Per trasformare questo in una risposta nel tuo caso, semplicemente aggiungi "-Runasync" fino alla fine del comando stop-vm, come così:

$VM | Stop-VM -Confirm:$false -RunAsync

Altri suggerimenti

Ogni volta che inizi un lavoro, PowerShell crea un nuovo runspace. Ciò significa un nuovo ambiente che potrebbe essere necessario inizializzare e che include il caricamento di snap-in e la connessione al server VI. Start-Job ha un parametro che puoi usare qui chiamato InitializzationScript. Prova qualcosa di simile:

Start-Job -InitializationScript { Add-PSSnapin VMware.VimAutomation.Core } {
    Connect-ViServer myserver
    Get-VM foo | Stop-VM
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top