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

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. :-)

Change HA settings for virtual machines using Powershell

Using this small script it is possible to change the HA settings for multiple virtual machines in an HA cluster.

Example:

– multiple virtual machines all with Name XXX-console

HA restart policy possible values:

-HARestartPriority:Low
-HARestartPriority:High
-HARestartPriority:Disabled
-HARestartPriority:Medium
-HARestartPriority:ClusterRestartPriority

Connect-VIServer -Server VCENTER-IP -User USER -Password PASSWORD

$Cluster = "CLUSTERNAME"
$vms = Get-VM -Location $Cluster -Name "*-console" | sort

foreach ($vm in $vms) {
	Write-Host $vm
	$result = $vm | Set-VM -HARestartPriority:Low -Confirm:$false
}

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

Configure local syslog folder on all your ESXi servers

########################################################################################################
# Steps to use the script:                                                                             #
# 1st: create a folder on an shared datastore                                                          # 
# 2nd: adjust the content of the variable $FolderName to the name of the folder created in step 1      #
# 3rd: adjust the content of the variable $datastore to the name of the shared datastore               #
# 4th: adjust vCenter IP/Username/Password to match your settings                                      #
########################################################################################################

Connect-VIServer -Server VCIPADDRESS -User USERNAME -Password PASSWORD

$esxihosts = Get-VMHost
$FolderName = "esxi_syslog"
$datastore = "NAMEofSAN"

foreach ($esxi in $esxihosts) {
	$hostname = $esxi.Name.split(".")[0]
	$value = "[$datastore] $Foldername/$hostname.log"
	Write-Host $value
	Set-VMHostAdvancedConfiguration -VMHost $esxi -Name "Syslog.Local.DatastorePath" -Value $value
	Clear-Variable hostname -ErrorAction SilentlyContinue
	Clear-Variable value -ErrorAction SilentlyContinue
}
Disconnect-VIServer -Server VCIPADDRESS -Force -Confirm:$false

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

Show WWN of FC devices

First you need to connect to a vCenter:

Connect-VIServer -Server VCENTERIP -User USERNAME -Password PASSWORD

Get-VMHost | Sort | Select Name,
     @{N="FC Device";E={[string]::Join(",",(($_ | Get-View).Config.StorageDevice.HostBusAdapter | where{$_.GetType().Name -eq "HostFibreChannelHba"} | %{$_.Device}))}},
     @{N="FC WWN";E={[string]::Join(",",(($_ | Get-View).Config.StorageDevice.HostBusAdapter | where{$_.GetType().Name -eq "HostFibreChannelHba"} | %{"{0:x}" -f $_.NodeWorldWideName}))}}

Disconnect-VIServer -Server VCENTERIP -Force -Confirm:$false