vROPs powershell module

If you would like to manage your vROPs using Powershell the following module could be helpful.

Quote:

PowervROps is a module written for PowerShell that can be used to access various elements of the vRealize Operations Manager API via PowerShell functions.

Link: https://github.com/andydvmware/PowervROps

Get all guest IPs of all your Virtual Machines using Powershell

This is a small powershell script to get all Guest IPs from all virtual machines

$VCENTER="10.1.1.3"
Connect-VIServer -Server $VCENTER

$vms = Get-VM | Sort

$file = "c:\ip_list.txt"

foreach ($vm in $vms){
	
	foreach($ip in $vm.Guest.IpAddress){
		Write-Host "$vm $ip"
		"$vm $ip" | Out-File -FilePath $file -Append

	}

}

Disconnect-VIServer -Server $VCENTER -Confirm:$false -Force:$true

Upload file to webdav using Powershell

This is small powershell script to upload a file from your local disk to a webdav server. It is also proxy capable.

#Complete path of the file to be uploaded
$file = "d:\test_file.txt"
 
#URL without the last "/"
$url  = "https://YOUR-SERVER/webdav"
$proxy = "http=PROXY-SERVER:PORT"  
 
#User and Pwd for Webdav Access
$user = "USERNAME"
$pass = "PASSWORD"
 
$url += "/" + $file.split('\')[(($file.split("\")).count - 1)]

# Set binary file type
Set-Variable -name adFileTypeBinary -value 1 -option Constant 
 
$objADOStream = New-Object -ComObject ADODB.Stream
$objADOStream.Open()
$objADOStream.Type = $adFileTypeBinary
$objADOStream.LoadFromFile("$file")
$buffer = $objADOStream.Read()
$objXMLHTTP = New-Object -ComObject MSXML2.ServerXMLHTTP
$objXMLHTTP.setProxy(2, $proxy,"")
$objXMLHTTP.Open("PUT", $url, $False, $user, $pass)
$objXMLHTTP.send($buffer)

Change Linux User password using Powershell

Sounds strange but yes it is possible :-) Just one module and some lines of Powershell code and thats it.

Import-Module SSH-Sessions

$old_passwd = "vmware"
$new_passwd = "VMware1!"

New-SshSession -ComputerName IP-ADDRESS -Username admin -Password $old_passwd

$result = Invoke-SshCommand -ComputerName IP-ADDRESS -Command "printf '%s\n' $old_passwd $new_passwd $new_passwd | passwd"

Write-Host $result

Remove-SshSession -RemoveAll

Collect ESXi stats with powershell and send it to Graphite server

I was not quite happy with the statistics from the vCenter. It is not possible to get an overview overall my ESXi servers. :-( Someone pointed me to the tool Graphite that this is a cool solution to visualize such kind of statistics. So I decided to give it a try.

I created and virtual machine running Centos and Graphite as target for my collected statistics. I will post an How to later.

Furthermore I had to create an powershell script which collects the stats of each ESXi in my cluster, transform it a graphite compatible format and transfer it to the graphite server.

#vCenter settings
$vCenter = "VCENTER-IP"
$user = "USERNAME"
$password = "PASSWORD"
$cluster = "YOUR-CLUSTER"
#Graphite server 
$remoteHost = "GRAPHITE-SERVER-IP"

#Socket to send results to Graphite server	 
$socket = new-object System.Net.Sockets.TcpClient($remoteHost, 2003)
$stream = $socket.GetStream()
$writer = new-object System.IO.StreamWriter $stream

Write-Host "Connected"
#Connect to vCenter
Connect-VIServer -Server $vCenter -User $user -Password $password 

#Get all ESXi hosts from Cluster
$esxhosts = Get-VMHost -Location $cluster | Sort

#Collect stats foreach ESXi server and bring it in a Graphite compatible format
foreach ($esxName in $esxhosts){

	$allstats = Get-Stat -Entity (Get-VMHost $esxName) -MaxSamples 1 -Realtime -Stat cpu.usage.average,disk.usage.average,net.usage.average | Sort
	Write-Host $esxName
	foreach($stat in $allstats){
		#Get Timestamp of stats and convert to UNIX timestamp
		$time = $stat.Timestamp
		$date = [int][double]::Parse((Get-Date -Date $time -UFormat %s))
		#Filter only average stats (Stats for CPU's are available foreach CPU and as average of all CPU's)
		$instance = $stat.Instance
		if($instance -eq [DBNull]::Value){
			#create a base for the graphite tree
			$base = "dc.vmware.prod."
			#remove the .usage.average
			$type = (($stat.MetricId).Replace(".usage.average",""))
			#remove the domain from the esxi name
			$name = (($esxName.Name).Replace(" ","")).Replace(".your-domain.de","")
			$value = $stat.Value
			#build the graphite compatible string
			$result = "$base$name.$type $value $date"
			#Console output just for testing
			Write-Host "Sent Result: $result"
			#send result to graphite server
			$writer.WriteLine($result)
			$writer.Flush()
		}
	}
	Write-Host " "
}
## Close the streams
$writer.Close()
$stream.Close()
#disconnect from vcenter
Disconnect-VIServer -Server $vCenter -Confirm:$false -Force
Write-Host "Done"

Below is a screenshot of an Graphite graph displaying the CPU average usage of all ESXi servers.

That’s it :-)

HomeLab and nested ESXi server

After an short weekend with a minimal of sleep … I’m done my Homelab is up and running. Furthermore I have created an template of an nested ESXi (virtualized ESXi). These nested ESXi are perfect for testing of Powershell scripts which I use to initial configure an new ESXi. Next steps which I have planned is to migrate my existing scripts to Powershell 2.0 modules and additionally extend the useability of it. So hopefully it will be possible to enter the IP into an GUI and select per SelectBox different configurations and than just hit configure. :-)

VMware Tools Status report

Script to create a report about the VMware Tools status:

Sample Output:

Total VMs: 527
Total powered on: 474
Total powered off: 53
ToolsOK: 140
ToolsOld: 227
ToolsNotInstalled: 106
DisConnect from Virtual Center

Set-PSDebug -Strict
$VIServer = "VCENTERIP"
Connect-VIServer -server $VIServer -User USERNAME -Password PASSWORD

$vms = Get-VM | Sort Name
$on = 0
$toolsOk = 0
$toolsOld = 0
$toolsNotInstalled = 0
foreach ($vm in $vms){
	if ($vm.PowerState -like "PoweredOn"){
		$vmview = $vm | Get-View
		$toolsstatus = $vmview.Guest.ToolsStatus
		$toolsrunningstatus = $vmview.Guest.ToolsRunningStatus
		$toolsversionstatus = $vmview.Guest.ToolsVersionStatus
		$on = $on+1
		if ($toolsstatus -like "toolsOk"){
			$toolsOk = $toolsOk + 1
		}
		if ($toolsstatus -like "toolsOld"){
			$toolsOld = $toolsOld + 1
		}
		if ($toolsstatus -like "toolsNotInstalled"){
			$toolsNotInstalled = $toolsNotInstalled + 1
		}
	}
}
$count = $vms.Count
$off = $count - $on
Write-Host "Total VMs: $count" 
Write-Host "Total powered on: $on"
Write-Host "Total powered off: $off"
Write-Host "ToolsOK: $toolsOk"
Write-Host "ToolsOld: $toolsOld"
Write-Host "ToolsNotInstalled: $toolsNotInstalled"
# DisConnect to Virtual Center
Write-Host "DisConnect from Virtual Center"
Disconnect-VIServer -Server $VIServer -Confirm:$False

Get VM information as Script node for the Virtualization EcoShell

This script node will open a small window with a drop down menu with all your VM’s listed. Select one and click on OK. The script will collect some information and then display them.

Script node:

if ($global:defaultviservers) {
	#Generated Form Function
	function GenerateForm {
	########################################################################
	# Code Generated By: SAPIEN Technologies PrimalForms (Community Edition) v1.0.7.0
	# Generated On: 25/11/2009 12:55
	# Generated By: IT2000
	########################################################################
	
	#region Import the Assemblies
	[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
	[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
	#endregion
	
	#region Generated Form Objects
	$form1 = New-Object System.Windows.Forms.Form
	$button1 = New-Object System.Windows.Forms.Button
	$label1 = New-Object System.Windows.Forms.Label
	$comboBox1 = New-Object System.Windows.Forms.ComboBox
	$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
	#endregion Generated Form Objects
	
	#----------------------------------------------
	#Generated Event Script Blocks
	#----------------------------------------------
	#Provide Custom Code for events specified in PrimalForms.
	$button1_OnClick= 
	{
	$global:Cluster = $comboBox1.SelectedItem
	$form1.close()
	}
	
	$handler_label2_Click= 
	{
	#TODO: Place custom script here
	
	}
	
	$OnLoadForm_StateCorrection=
	{#Correct the initial state of the form to prevent the .Net maximized form issue
		$form1.WindowState = $InitialFormWindowState
		
		Foreach ($Cluster in (Get-VM | Sort Name)){
			$comboBox1.items.add($Cluster)
			$comboBox1.SelectedIndex=0
		}
		$Combobox1.visible = $true
		$label1.visible = $true
		$button1.visible = $true
		$form1.Text = "Please select a VM"
	}
	
	#----------------------------------------------
	#region Generated Form Code
	$form1.AutoScaleMode = 0
	$form1.Text = "Please wait loading VM's...."
	$form1.Name = "form1"
	$form1.DataBindings.DefaultDataSourceUpdateMode = 0
	$System_Drawing_Size = New-Object System.Drawing.Size
	$System_Drawing_Size.Height = 66
	$System_Drawing_Size.Width = 392
	$form1.ClientSize = $System_Drawing_Size
	$form1.FormBorderStyle = 1
	
	$form1.Controls.Add($InfoLabel)
	
	$button1.TabIndex = 2
	$System_Drawing_Size = New-Object System.Drawing.Size
	$System_Drawing_Size.Height = 23
	$System_Drawing_Size.Width = 75
	$button1.Size = $System_Drawing_Size
	$button1.Name = "button1"
	$button1.UseVisualStyleBackColor = $True
	
	$button1.Visible = $False
	$button1.Text = "OK"
	$System_Drawing_Point = New-Object System.Drawing.Point
	$System_Drawing_Point.X = 300
	$System_Drawing_Point.Y = 21
	$button1.Location = $System_Drawing_Point
	
	$button1.DataBindings.DefaultDataSourceUpdateMode = 0
	$button1.add_Click($button1_OnClick)
	
	$form1.Controls.Add($button1)
	
	$label1.TabIndex = 1
	$label1.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",8.25,1,3,1)
	$System_Drawing_Size = New-Object System.Drawing.Size
	$System_Drawing_Size.Height = 23
	$System_Drawing_Size.Width = 50
	$label1.Size = $System_Drawing_Size
	$label1.Name = "label1"
	$label1.Visible = $False
	$label1.Text = "VM:"
	$System_Drawing_Point = New-Object System.Drawing.Point
	$System_Drawing_Point.X = 8
	$System_Drawing_Point.Y = 26
	$label1.Location = $System_Drawing_Point
	
	$label1.DataBindings.DefaultDataSourceUpdateMode = 0
	
	$form1.Controls.Add($label1)
	
	$System_Drawing_Point = New-Object System.Drawing.Point
	$System_Drawing_Point.X = 64
	$System_Drawing_Point.Y = 21
	$comboBox1.Location = $System_Drawing_Point
	$comboBox1.Visible = $False
	$comboBox1.DataBindings.DefaultDataSourceUpdateMode = 0
	$comboBox1.FormattingEnabled = $True
	$comboBox1.Name = "comboBox1"
	$comboBox1.TabIndex = 0
	$System_Drawing_Size = New-Object System.Drawing.Size
	$System_Drawing_Size.Height = 21
	$System_Drawing_Size.Width = 217
	$comboBox1.Size = $System_Drawing_Size
	
	$form1.Controls.Add($comboBox1)
	
	#endregion Generated Form Code
	
	#Save the initial state of the form
	$InitialFormWindowState = $form1.WindowState
	#Init the OnLoad event to correct the initial state of the form
	$form1.add_Load($OnLoadForm_StateCorrection)
		
	#Show the Form
	$form1.ShowDialog()| Out-Null
	
	} #End Function
	
	#Call the Function
	GenerateForm
	
	Get-VM $global:Cluster | % {
	$vm = Get-View $_.ID
	$vms = "" | Select-Object VMName, Hostname, VMState, TotalCPU, TotalMemory, TotalNics, OverallCpuUsage, MemoryUsage, ToolsStatus, MemoryLimit, MemoryReservation, CPUreservation
	$vms.VMName = $vm.Name
#	$vms.Hostname = $vm.hostname
	$vms.Hostname = Get-VMHost -VM $vm.Name
#	Write-Host $vms.Hostname
	$vms.VMState = $vm.summary.runtime.powerState
	$vms.TotalCPU = $vm.summary.config.numcpu
	$vms.TotalMemory = $vm.summary.config.memorysizemb
	$vms.TotalNics = $vm.summary.config.numEthernetCards
	$vms.OverallCpuUsage = $vm.summary.quickStats.OverallCpuUsage
	$vms.MemoryUsage = $vm.summary.quickStats.guestMemoryUsage
	$vms.ToolsStatus = $vm.guest.toolsstatus
	$vms.MemoryLimit = $vm.resourceconfig.memoryallocation.limit
	$vms.MemoryReservation = $vm.resourceconfig.memoryallocation.reservation
	$vms.CPUreservation = $vm.resourceconfig.cpuallocation.reservation
#	$vms.CPUlimit = $vm.resourceconfig.cpuallocation.limit
	$vms.PSTypeNames.Clear()
	$vms.PSTypeNames.Add('Virtu-al.PowerPack.VMInfo')
	$vms.PSTypeNames.Add('Virtu-al.PowerPack.VM')
	$vms
	}
}
Else {
	[System.Windows.Forms.MessageBox]::Show('You must connect to one or more hosts before you can use this node. Please click on the ''Managed Hosts'' node of the VMware PowerPack, connect to one or more of the servers you have configured there, and then try again.','Connection not established',[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Information) | Out-Null
}

Count VMs ToolsOK | ToolsOld | ToolsNotInstalled

Connect-VIServer -server VCSERVER -User USER -Password PASSWORD

$vms = Get-VM | Sort Name
$on = 0
$toolsOk = 0
$toolsOld = 0
$toolsNotInstalled = 0
foreach ($vm in $vms){
	if ($vm.PowerState -like "PoweredOn"){
		$vmview = $vm | Get-View
		$toolsstatus = $vmview.Guest.ToolsStatus
		$toolsrunningstatus = $vmview.Guest.ToolsRunningStatus
		$toolsversionstatus = $vmview.Guest.ToolsVersionStatus
		$on = $on+1
		if ($toolsstatus -like "toolsOk"){
			$toolsOk = $toolsOk + 1
		}
		if ($toolsstatus -like "toolsOld"){
			$toolsOld = $toolsOld + 1
		}
		if ($toolsstatus -like "toolsNotInstalled"){
			$toolsNotInstalled = $toolsNotInstalled + 1
		}
	}
}
$count = $vms.Count
$off = $count - $on
Write-Host "Total VMs: $count" 
Write-Host "Total powered on: $on"
Write-Host "Total powered off: $off"
Write-Host "ToolsOK: $toolsOk"
Write-Host "ToolsOld: $toolsOld"
Write-Host "ToolsNotInstalled: $toolsNotInstalled"

# DisConnect to Virtual Center
Write-Host "DisConnect from Virtual Center"
Disconnect-VIServer -Server VCSERVER -Confirm:$False

Find VMs with Video Card Memory higher than 30MB

Connect-VIServer -server VCENTER -User USER -Password PASSWORD

$vms = Get-VM
foreach ($vm in $vms) {
	$vmview = $vm | Get-View 
	foreach ($device in $vmview.config.hardware.device)
	{
		if ($device.Key -eq 500){
			$test = $device.DeviceInfo.Summary
			$result = $device.videoRamSizeInKB
			if ($result -cgt 30000){
				$mb = $result/1024
				Write-Host $vm $result $mb
			}
		}
	}
}
Write-Host "Done"