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 

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: 

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 

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"