### -----------------------------------------------------------------
### Written by Matt Brown
###
### Description: Test VMWare Host Networks
###
### Requires:
### VMWare Snapin
### Test VM with a Local Admin Account, may need to turn UAC Off
### CSV File with Network Info
###
### Sample CSV File:
### Name,VLanId,ip,netmask,gateway
### VM-Subnet01,21,192.168.3.5,255.255.255.0,192.168.3.1
### VM-Subnet02,22,192.168.4.5,255.255.255.0,192.168.3.5
### -----------------------------------------------------------------
## Load VMWare Snapin
if(-not (Get-PSSnapin | where { $_.Name -match 'VMware.VimAutomation.Core' })) {
Add-PSsnapin VMware.VimAutomation.Core
}
## Vars to Configure
$vCenterServer = "VC.domain.com"
$clusterToTest = "ProductionCluster"
$TestMachine = "TestVM"
$vmnicname = "Local Area Connection"
$NetworkListFile = "VMNetworkTestList.csv"
function TestNetwork($currenthost,$newhost,$vm,$gateway,$guestCred) {
if($currenthost -notmatch $newhost) {
Write-Host ("Moving $TestMachine to " + $_.Name) -ForegroundColor Cyan
$VM | Move-VM -Destination $_.Name | Out-Null
}
$script = ("ping " + $gateway)
Write-Host $script -ForegroundColor Yellow
$pingtest = Invoke-VMScript -VM $vm -ScriptText $script -scriptType bat -Credential $guestCred
if($pingtest.ScriptOutput -match "(0% loss)") { Write-Host "Test Success" -ForegroundColor Green } else { $pingtest.ScriptOutput }
#$continue = Read-Host "Hit Enter to Test on Next Host."
return $newhost
}
## Connect to vCenter and grab information
Connect-VIServer -Server $vCenterServer -credential (Get-Credential -Message ("vCenter Account"))
$hosts = Get-VMHost -Location $clusterToTest | select Name
$VM = get-vm -name $TestMachine
$currenthost = $vm.VMHost.Name
$guestCred = Get-Credential -UserName ($TestMachine + "\") -Message "Local Admin Account"
$NetworksToTest = Import-Csv $NetworkListFile
$NetworksToTest | foreach {
$NetworkName = $_.Name
$IP = $_.ip
$gateway = $_.gateway
$netmask = $_.netmask
Write-Host "Changing Network on $TestMachine to $NetworkName" -ForegroundColor Cyan
Get-NetworkAdapter -VM $vm | Set-NetworkAdapter -NetworkName $NetworkName -Confirm:$false | Out-Null
#$continue = Read-Host "Hit Enter to Set the IP Address."
Write-Host "Changing IP Address on $TestMachine to $IP" -ForegroundColor Cyan
$VM | Get-VMGuestNetworkInterface -GuestCredential $guestCred | Where-Object { $_.Name -eq $vmnicname } | Set-VMGuestNetworkInterface -GuestCredential $guestCred -Ip $IP -Netmask $netmask -Gateway $gateway | Out-Null
#$continue = Read-Host "Hit Enter to Run Ping Tests."
$x = @()
$hosts | where { $_ -notmatch $currenthost } | foreach { $x += $_.Name }
$currenthost = TestNetwork $currenthost $currenthost $vm $gateway $guestCred
$hosts | foreach {
$currenthost = TestNetwork $currenthost $_ $vm $gateway $guestCred
}
}
Ramblings from University IT... VMWare, NetApp, Powershell,Active Directory, Exchange and Scripting.
Showing posts with label VMware PowerCLI. Show all posts
Showing posts with label VMware PowerCLI. Show all posts
Friday, November 7, 2014
Powershell: Test VMWare Host Networks
Here's a handy script I use to verify networks on my VMWare Clusters. This script takes a test VM and changes the Network and IP Address from a list, then does a simple ping from the VM on each host to let you know your networks are working correctly before moving Production Machines to it. The need for this spawned from a missing "allowed vLan id" not being configured across the ether channel ports on one of the hosts.
Monday, November 3, 2014
Powershell: VMWare Snapshot Report
Here's a handy script I use to send me a report on all VM's in my VMWare Environment with active snapshots. This script finds all VM's with Snapshots, creates an HTML report and emails the info to the provided list. I schedule this to run via the Task Manager automatically every week.
### -----------------------------------------------------------------
### Written by Matt Brown
###
### Description: Powershell script grabs a list of snapshots from the
### VMWare Enviornment and emails them out as a report.
###
### Requires: VMWare Powershell Extenstions
### -----------------------------------------------------------------
$thedate = Get-Date -f yyyy-MM-dd_HH-mm
$scriptname = "VMWareSnapshots.ps1"
$scriptlocation = "C:\Scripts\VMWare\"
$filename = $scriptlocation + "Transcripts\" + $thedate + "_Snapshots.rtf"
start-transcript -path $filename
$htmlOutFile = "C:\Scripts\VMWare\Reports\snapshot_list.htm"
$vCenterServer = "VC.domain.com"
$vCenterLocation = "ProductionCluster"
### Load VMWare Snapin
Add-PSSnapin -Name VMware.VimAutomation.Core
### -----------------------------------------------------------------
### Start Functions
### -----------------------------------------------------------------
function SendEmail($body,$subject=("Script ERROR: " + $scriptname + " on " + ($env:COMPUTERNAME)),$to=@("admin@domain.com"),$attFile=$false) {
$message = New-Object System.Net.Mail.MailMessage
if($attFile) {
$attachement = New-Object System.Net.Mail.Attachment($attFile)
$message.Attachments.Add($attachement)
$message.Headers.Add("message-id", "<3BD50098E401463AA228377848493927-1>") # Adding a Bell Icon for Outlook users
}
$message.From = "admin@domain.com"
$to | foreach {
$message.To.Add($_) # default is admin in function
}
$message.Subject = $subject
$bodyh = "----------------------------------------------------------------------------------------------------`n"
$bodyh += "Server: " + ($env:COMPUTERNAME) + "`n"
$bodyh += "User: " + ($env:USERDOMAIN) + "\" + ($env:USERNAME) + "`n"
$bodyh += "Location: " + $scriptlocation + $scriptname + "`n"
$bodyh += "----------------------------------------------------------------------------------------------------`n`n"
$message.Body = $bodyh + $body
$smtp = New-Object System.net.Mail.SmtpClient
$smtp.Host = "smtpserver.domain.com"
$smtp.UseDefaultCredentials = $true
$smtp.Send($message)
}
### -----------------------------------------------------------------
Connect-VIServer $vCenterServer
# HTML/CSS style for the output file
$head = ""
$title = ($vCenterLocation + " VMWare Snapshots as of ” + (get-date -Format "MM-dd-yyyy"))
$data = @()
Get-VM -Location $vCenterLocation | foreach {
$snapshots = Get-SnapShot -VM $_
if ($snapshots.Name.Length -ige 1 -or $snapshots.length){
ForEach ($snapshot in $snapshots){
$myObj = "" | Select-Object VM, Snapshot, Created, Description
$myObj.VM = $_.name
$myObj.Snapshot = $snapshot.name
$myObj.Created = $snapshot.created
$myObj.Description = $snapshot.description
$data += $myObj
}
}
}
# Write the output to an HTML file
$data | Sort-Object VM | ConvertTo-HTML -Head $head -Body (""+$title+"
") | Out-File $htmlOutFile
SendEmail ("See Attached VMWare Snapshot Report") $title (@("joe@domain.com","fred@domain.com")) $htmlOutFile
DisConnect-VIServer -Confirm:$false
stop-transcript
Subscribe to:
Posts (Atom)