Ce script PowerShell permet d'arrêter une VM de façon soft via les VMTools, d'en faire un SnapShot, de la redémarrer et de passer éventuellement une commande à faire exécuter à la VM.
La liste des machines à traiter est fournie via un fichie texte.
La variable à renseigner est la suivante :
$EmplacementFichier = "C:\Chemin_Liste_VM.txt"
Comme vous le constatez le nom et l'emplacement du ficher par défaut est C:\Chemin_Liste_VM.txt
Le script a été réalisé avec l'interface de programmation PowerGUI.
Comme c'est un script qui se connecte aux infrastructures virtuelles de VMWare, il vous faudra télécharger et installer au préalable PowerCli.
Pour cela il vous faudra un compte (gratuit) chez VMWare.
Syntaxe à utiliser pour lancer le script
Powershell -command "c:\NomScriptPowerShell.ps1" -v NomVm
Lien vers le fichier : cliquez ici
Le script
Clear-Host
param
(
[string]$VIserver,
[string]$VILogin,
[string]$VIMotdepasse,
[string]$VMName,
[string]$varErrorCount,
[switch]$verbose,
[switch]$debug
)
Clear-Host
#Definition de 2 variables globales
$global:MyVar01 = ""
$global:MyVar02 = ""
$VIserver = "Nom vCenter"
$VILogin = "domaine\login" #Domaine\login avec droits de connexion au vCenter
$VIMotdepasse = "YourPassword" #Mot de passe pour connexion au vCenter
$VMLogin = "LoginCompteLocalDeLaVM"
$VMMotdepasse = "MotDePasseLocalSurVM"
function main()
{
asnp vmware* #Import modules VMWares
$ErrorActionPreference = "Continue"
if ($verbose) {$VerbosePreference = "Continue"}
if ($debug) {$DebugPreference = "Continue"}
$DebugPreference = "SilentlyContinue"
CheckVIToolKit
Connect-VIServer -Server $VIserver -User $VILogin -Password $VIMotdepasse
Write-Host "Traitement de $VMName"
$UneVM = Get-VM -Name $VMName
Write-Host $UneVM.PowerState #Juste pour afficher si la VM est allumée ou non
$Error.Clear()
Write-Host "Traitement de $VMName"
$UneVM = Get-VM -Name $UneLigne
$toolsstatus = $vmview.Guest.ToolsStatus
Write-Host "$VMName : Tools status : $toolsstatus"
Write-Host $UneVM.PowerState
if ($UneVM.PowerState -eq "PoweredOn") {
Write-Host "Shutdown guest de $VMName"
Shutdown-VMGuest -VM $UneVM -Confirm:$false
}
while ($UneVM.PowerState -eq "PoweredOn") {
sleep 4
$UneVM = Get-VM -Name $VMName #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con.
Write-Host $UneVM.PowerState
}
Write-Host "$VMName est bien arrêté"
Write-Host "$VMName : Création d'un snapshot"
New-Snapshot -Name "SnapShot via PowerShell" -Description "PowerShell" -VM $UneVM #-RunAsync
Write-Host "$VMName : Démarrage de la VM $VMName"
Start-VM -VM $UneVM
while ($UneVM.PowerState -ne "PoweredOn") {
Write-Host "La Vm $VMName n'est pas encore allumée. Attente de 4 secondes"
sleep 4
$UneVM = Get-VM -Name $VMName #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con.
Write-Host $UneVM.PowerState
}
#Attente tant que l'on n'arrive pas à contacter les VMTools
write-host "Attente de la disponibilité des VMTools"
do {
$toolsStatus = (Get-VM $UneVM | Get-View).Guest.ToolsStatus
write-host $toolsStatus
sleep 3
} until ( $toolsStatus -eq ‘toolsOk’ )
Write-Host "Tools de $VMName Ok"
#Attente de la possibilité du lancement d'une commande auprès des VMTools
write-host "Test de lancement d'une commande via les VMTools"
write-host "Ce test echoue a chaque fois si le login et mdp est faux donc attention"
do {
sleep 10
$Error.Clear()
$Mycommand = "dir.exe"
Invoke-VMScript -ScriptText $Mycommand -VM $UneVM -ScriptType Bat -GuestUser $VMLogin -GuestPassword $VMMotdepasse
$varErrorCount = [string]$($Error.Count)
write-host "Error count : $($Error.Count)"
write-host "varErrorCount : $varErrorCount"
} while ($varErrorCount -ne "0")
write-host "$VMName est maintenant allumee et les VMTools peuvent executer une commande"
}
function CheckVIToolKit()
{
## Before we do anything we must check to see if the user has the VI toolkit installed.
## If user does not then we prompt the user and exit.
$Error.Clear()
Get-PSSnapin vmware*
if($Error.Count -ne 0)
{
Clear-Host
Write-Host "`n`n`t`t ERROR - To run this script, the VI Toolkit must be installed and registered with Powershell. If the VI Tollkit is installed," -foregroundcolor red -backgroundColor yellow
Write-Host "`t`t go to the Settings menu in Powershell Plus and click on Manage Snapins." -foregroundcolor red -backgroundColor yellow
# Read-Host "`n`n`t Press <Enter> to continue."
break
}
}## EOF: CheckVIToolKit()
Function ParseCommand($oArgs){
#Parses the command line and fills the script variables
#with the appropriate values.
# $test = "-n,test"
# $oArgs = $test.split(",")
$ArgCount = 0
if (!$oArgs.length -gt 0){
write-host "No arguments specified."
}
While ($ArgCount -lt $oArgs.length){
switch ($oArgs[$ArgCount].ToLower()){
"-v"{
$global:MyVar01 = $oArgs[($ArgCount+1)]
$ArgCount = ($ArgCount + 2)
write-host "-v : $MyVar01"
}
default{
write-host "Invalid command."
# Help
exit
}
}
}
}
#Parse commands
ParseCommand($args)
$VMName = $MyVar01
write-host "VMName : $VMName"
## Run Main
main
Lien vers le fichier : cliquez ici
Ci-dessous à peut prêt le même script powershell à la nuance que celui-ci est lancé via un script VbScript qui pose des questions et envoie les réponses au script Powershell via des paramètres.
Le VbScript :
Option Explicit
Dim CheminScriptActuel, ScriptFileName, Position
Dim WSHShell, Commande
Dim NomVM, varLoginAuthentVM, varMotDePasseAuthentVM, varNomSnapShot
Dim objFSO, objTextFile, CheminFichierLog
'Déclaration des constantes
Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8
CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1)
'Wscript.Echo "Votre script '" & wscript.scriptname & "' est dans le répertoire '" & CheminScriptActuel & "'."
ScriptFileName = wscript.scriptname
Position = InstrRev(ScriptFileName,".")
if (Position > 0) Then ScriptFileName = Left(ScriptFileName, Position - 1)
CheminFichierLog = CheminScriptActuel & "\" & ScriptFileName & "_log.txt"
NomVM = Trim(InputBox("Entrez le nom de la VM","Nom de la VM","NomVM"))
varLoginAuthentVM = Trim(InputBox("Entrez le login qui sera utilisé pour s'authentifier sur la VM","Login","Administrator"))
varMotDePasseAuthentVM = Trim(InputBox("Entrez le mot de passe associé","Mot de passe","Password"))
varNomSnapShot = Trim(InputBox("Entrez le nom du snapshot","Nom du snapshot","Snapshot via Powershell"))
If Len(NomVM) > 0 Then
Set WSHShell = CreateObject("WScript.Shell")
Commande = "cmd /k Powershell -file """ & CheminScriptActuel & "\" & ScriptFileName & ".ps1"" -v """ & NomVM & """ -loginvm """ & varLoginAuthentVM & """ -mdpvm """& varMotDePasseAuthentVM & """ -nomsnap """ & varNomSnapShot & """"
msgbox Commande
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(CheminFichierLog, ForWritting, True)
objTextFile.WriteLine(Commande) 'On ecrit la date et l'heure dans le fichier
objTextFile.Close 'Fermeture du fichier
Set objTextFile = Nothing
Set objFSO = Nothing
WSHShell.Run Commande
Set WSHShell = Nothing
End If
Lien vers le fichier : cliquez ici
Le script powershell :
Clear-Host
$VIserver = "NomvCenter"
$VILogin = "domaine\loginvCenter"
$VIMotdepasse = "MotDePassevCenter"
#Definition des variables globales
$global:varNomVM = ""
$global:varVMLogin = ""
$global:varVMMotdepasse = ""
$global:varNomSnapshot = ""
function main()
{
asnp vmware* #Import modules VMWares
$ErrorActionPreference = "Continue"
if ($verbose) {$VerbosePreference = "Continue"}
if ($debug) {$DebugPreference = "Continue"}
$DebugPreference = "SilentlyContinue"
CheckVIToolKit
Connect-VIServer -Server $VIserver -User $VILogin -Password $VIMotdepasse
Write-Host "Traitement de $varNomVM"
$UneVM = Get-VM -Name $varNomVM
Write-Host $UneVM.PowerState #Juste pour afficher si la VM est allumée ou non
$Error.Clear()
Write-Host "Traitement de $varNomVM"
$UneVM = Get-VM -Name $UneLigne
$toolsstatus = $vmview.Guest.ToolsStatus
Write-Host "$varNomVM : Tools status : $toolsstatus"
Write-Host $UneVM.PowerState
if ($UneVM.PowerState -eq "PoweredOn") {
Write-Host "Shutdown guest de $varNomVM"
Shutdown-VMGuest -VM $UneVM -Confirm:$false
}
while ($UneVM.PowerState -eq "PoweredOn") {
sleep 4
$UneVM = Get-VM -Name $varNomVM #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con.
Write-Host $UneVM.PowerState
}
Write-Host "$varNomVM est bien arrêté"
Write-Host "$varNomVM : Création d'un snapshot"
New-Snapshot -Name $varNomSnapshot -Description $varNomSnapshot -VM $UneVM #-RunAsync
Write-Host "$varNomVM : Démarrage de la VM $varNomVM"
Start-VM -VM $UneVM
while ($UneVM.PowerState -ne "PoweredOn") {
Write-Host "La Vm $varNomVM n'est pas encore allumée. Attente de 4 secondes"
sleep 4
$UneVM = Get-VM -Name $varNomVM #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con.
Write-Host $UneVM.PowerState
}
#Attente tant que l'on n'arrive pas à contacter les VMTools
write-host "Attente de la disponibilité des VMTools"
do {
$toolsStatus = (Get-VM $UneVM | Get-View).Guest.ToolsStatus
write-host $toolsStatus
sleep 3
} until ( ($toolsStatus -eq toolsOk) -or ($toolsStatus -eq toolsOld))
Write-Host "Tools de $varNomVM Ok"
# #Attente de la possibilité du lancement d'une commande auprès des VMTools
# write-host "Test de lancement d'une commande via les VMTools"
# write-host "Ce test echoue a chaque fois si le login et mdp est faux donc attention"
# do {
# sleep 10
# $Error.Clear()
# $Mycommand = "dir.exe"
# Invoke-VMScript -ScriptText $Mycommand -VM $UneVM -ScriptType Bat -GuestUser $varVMLogin -GuestPassword $varVMMotdepasse
# $varErrorCount = [string]$($Error.Count)
# write-host "Error count : $($Error.Count)"
# write-host "varErrorCount : $varErrorCount"
# } while ($varErrorCount -ne "0")
# write-host "$varNomVM est maintenant allumee et les VMTools peuvent executer une commande"
Write-Host "Mise à jour des VMTools"
#Monter une ISO sur le CD
$DatastoreName = "[031-SVC-P315]"
$isopath = "_ISO/VMTOOLS_55U2/VMware-tools-windows-9.4.10-2092844.iso"
$FullIsoPath = "$DatastoreName $isopath"
$MyCd = get-cddrive -VM $UneVM | set-cddrive -IsoPath $FullIsoPath -Connected $true -Confirm:$false
$DriveLetter = "D:"
$ScriptText = "$DriveLetter\setup64.exe /S /v `"/qn REBOOT=R ADDLOCAL=ALL REMOVE=Hgfs,WYSE`""
Invoke-VMScript -VM $UneVM -ScriptText $ScriptText -ScriptType bat -GuestUser $VMLogin -GuestPassword $VMMotdepasse
#Démonter l'ISO
Set-CDDrive -CD $MyCd -NoMedia -Confirm:$false #Disconnect the ISO
sleep 10
}
function CheckVIToolKit()
{
## Before we do anything we must check to see if the user has the VI toolkit installed.
## If user does not then we prompt the user and exit.
$Error.Clear()
Get-PSSnapin vmware*
if($Error.Count -ne 0)
{
Clear-Host
Write-Host "`n`n`t`t ERROR - To run this script, the VI Toolkit must be installed and registered with Powershell. If the VI Tollkit is installed," -foregroundcolor red -backgroundColor yellow
Write-Host "`t`t go to the Settings menu in Powershell Plus and click on Manage Snapins." -foregroundcolor red -backgroundColor yellow
# Read-Host "`n`n`t Press <Enter> to continue."
break
}
}## EOF: CheckVIToolKit()
Function ParseCommand($oArgs){
#Parses the command line and fills the script variables
#with the appropriate values.
# $test = "-n,test"
# $oArgs = $test.split(",")
$ArgCount = 0
if (!$oArgs.length -gt 0){
write-host "No arguments specified."
}
While ($ArgCount -lt $oArgs.length){
switch ($oArgs[$ArgCount].ToLower()){
"-v"{
$global:varNomVM = $oArgs[($ArgCount+1)]
$ArgCount = ($ArgCount + 2)
write-host "-v : $varNomVM"
break
}
"-loginvm"{
$global:varVMLogin = $oArgs[($ArgCount+1)]
$ArgCount = ($ArgCount + 2)
write-host "-loginvm : $varVMLogin"
break
}
"-mdpvm"{
$global:varVMMotdepasse = $oArgs[($ArgCount+1)]
$ArgCount = ($ArgCount + 2)
write-host "-mdpvm : $varVMMotdepasse"
break
}
"-nomsnap"{
$global:varNomSnapshot = $oArgs[($ArgCount+1)]
$ArgCount = ($ArgCount + 2)
write-host "-nomsnap : $varNomSnapshot"
break
}
default{
write-host "Invalid command."
# Help
exit
}
}
}
}
#Parse commands
ParseCommand($args)
## Run Main
main
Lien vers le fichier : cliquez ici
Pages Web
Site Web | Description |
---|---|
PowerCLI : Connect-VIServer command | Aide de la commande Connect-VIServer |
Getshifting.com - script | Script pour un upgrade VMTools et Hardware |
Téléchargement(s)
Nom | Site Web d origine | Description |
---|---|---|
VMware-PowerCLI-5.1.0-793... | https://my.vmware.com/fr/web/v... | vSphere PowerCli |
Article(s) suivant(s)
Article(s) précédent(s)
Article(s) en relation(s)