I wanted to check if all of my vmhost system are keeping time with ntp. I wrote recently how to query time from vmhost system using esxcli. Today i want to show how to do this without esxcli, and also produce nice report and a summary which will help investigate issue with host time. I am comparing host time with local time o/s that is converted to UTC. If you are not sure whether your time is accurate then it might be a problem. Solution for this is to query remote utc time. In internet you can find sites that offer time web services that can be easily integrated to this script.
Have in mind that property DiffToUTC is in seconds.
I have tried to optimize this report as much as i can. It was possible to execute this report in 1 minute and 8 seconds. But it was not that readable and did not contain all of this information. On 100 vmhost+ it should fit in 1 – 2 minutes. Before i had approach with obtaining time using esxcli, but that was slower then this approach.
If you know how to query it faster, post a comment. Have in mind that this function is not perfect. I believe that there are better ways to show weather vmhost system is out of time or not. Anyway, this function helps a lot in diagnosing problems time on esx/esxi host systems.
It will state if ntpd is running or not, or for example if you have >100 host you can spot a pattern for ntp servers. Sometimes it is easy to overlook something, for example ntp servers:
172.16.x.y
72.16.x.y
Where you can easily see that you had a typo.
Sometimes you are just not aware that ntp service is running.
Or sometimes… 😉
Few screenshots from running this function:
From this screenshot where the report was stored in $myreport, we can see that we have some issues with host time, as there is a difference of 76 second compared to my local os time.
If you see DiffToUTC like 0.0xxxxx that would mean that you are ok. If you get readings > 1 seconds that could indicate something is wrong.
We can also do report for a single vmhost system.
We can do a full report and using the -summary switch, make function to return some description about the report.
Documentation for
HostDateTimeSystem -> Managed Object – HostDateTimeSystem
HostServiceSystem -> Managed Object – HostServiceSystem
I have added now option to check your local time which will be converted to UTC and compare it to UTC time taken from internet. Internet connection should be in place in order to use it. That was added if you suspect that your local time might not be correct and you would like to check it with other source. Please also read disclaimer,usage restrictions before using this time web service. So if you spot that your time differs to much from time taken from that ‘internet returned time’, it might indicate some issues, maybe the web service has issues, or our system.
Function below:
[sourcecode language=”powershell”]
function Get-VMHostTimeReport {
<#
.SYNOPSIS
Gets time from VM Hosts and checks with local time(to utc).
.DESCRIPTION
This function might help investigating issues with vm host time. If it is running without any
parameter it checks time for all hosts registered in virtual center to which user is currently
connected. Using parameter SingleVMHost will produce report for single vm host system.
VMHost should be the name of the host, string.
Report returns colums : Name (vmhost system name), VMHostTime (Time from vmhost),
UTCTime (this is the utc time from our local os), NTPServers ( if any are in the vmhost
configuration), NTPServiceRunning (checks if the ntp service is running on the vmhost),
DiffToUTC (that’s the difference in seconds between time reported by vmhost and our os)
By default it sorts report by from lowest to highest time difference reported.
.PARAMETER SingleVMHost
Specify single vmhost name that is registered in VC. This should be a string.
.PARAMETER Summary
Indicate if you would like to receive short summary about produced report.
.PARAMETER CheckTimeFromInternet
Indicate if you would like to see in summary information about your local time and remote
time. Time from remote web service will be checked and comapred to your system utc time.
.EXAMPLE
PS C:\> Get-VMHostTimeReport
Will produce report for all vmhosts that are registered within VirtualCenter to which user
is currently connected. It is possible to close the report into a variable for example:
$timereport=Get-VMHostTimeReport
You can then export this report to csv if needed for example, or view it again :
$timereport | format-table -autosize
For viewing convenience
.EXAMPLE
PS C:\> Get-VMHostTimeReport -SingleVMHost ‘myesxhost.local.lan’
Will produce report for given vmhost that is registered within VirtualCenter to which user
is currently connected.
.EXAMPLE
PS C:\> Get-VMHostTimeReport -Summary
Will produce report . and show a small summary which might indicate if there is a problem
with time sync on vmhost systems. Example of the summary below:
UTC time from the current system :Min and Max times during reporting period
Min: 9/3/2013 4:17:38 PM
Max: 9/3/2013 4:19:20 PM
While function was creating this report, first date that was returned by local os was the Min
and the last date that was returned by local os was the Max value.
VMHosts reported Times :Min and Max date / time while creating report
Min: 9/3/2013 4:16:35 PM
Max: 9/3/2013 4:19:20 PM
Our vmhost systems reported their date/time. If this time span is too big, this might indicate
issues with vmhost ntp sync.
Time Difference between VMHost and UTC from local os time Min, Max, Avg
Min: 0.03075
Max: 76.20985
Avg: 1.36604993421053
This is summary for comparing UTC vm host time to UTC time from local os. If you see
big Max value >1/2 sec that it might indicate that there is an issue with vmhost ntp time sync
If a switch parameter CheckTimeFromInternet is present in the summary section there will
be small report generated about your local time converted to UTC and time taken from
http://www.earthtools.org
You can then quickly see if there is an issue with your local time
.NOTES
NAME: Get-VMHostTimeReport
AUTHOR: Grzegorz Kulikowski
NOT WORKING ? #powercli @ irc.freenode.net
THANKS: http://www.earthtools.org
.LINK
http://psvmware.wordpress.com
#>
param(
[string]$SingleVMHost,
[switch]$Summary,
[switch]$CheckTimeFromInternet
)
$TimeReport=@()
if ($SingleVMHost) { $VMHosts=Get-View -ViewType HostSystem -Filter @{‘name’=$SingleVMHost} }
else{
$VMHosts=get-view -viewtype hostsystem -property name,ConfigManager.DateTimeSystem,ConfigManager.ServiceSystem -Filter @{‘runtime.ConnectionState’=’connected’}
}
Foreach($VMHost in $VMHosts){
$VMHostDateTimeSystem=get-view -id $VMHost.ConfigManager.DateTimeSystem
$VMHostServiceSystem=get-view -id $VMHost.ConfigManager.ServiceSystem
$VMHostTime=$VMHostDateTimeSystem.QueryDateTime()
$NtpServiceState=($VMHostServiceSystem.ServiceInfo.Service|Where-Object {$_.Key -eq ‘ntpd’}).Running
$NtpServers=$VMHostDateTimeSystem.DateTimeInfo.NtpConfig.Server
$UTCTime=(Get-Date).ToUniversalTime()
$TimeReport+=$vmhost| Select-Object -Property Name, @{n=’VMHostTime’;e={$VMHostTime}},@{n=’UTCTime’;e={$UTCTime}},@{n=’NTPServers’;e={$NtpServers}},@{n=’NTPServiceRunning’;e={$NtpServiceState}},@{n=’DiffToUTC’;e={[Math]::Round([math]::abs(($VMHostTime – $UTCTime).TotalSeconds),5)}}
}
if($Summary){
$SummaryUTCTime=$TimeReport|Measure-Object -Property UTCTime -Min -Max
$SummaryVMHostTime=$TimeReport|Measure-Object -Property VMHostTime -Min -Max
$SummaryDiffToUTC=$TimeReport|Measure-Object -Property DiffToUTC -Min -Max -Average
Write-Host “UTC time from the current system :Min and Max date/time while creating this report.”
Write-Host “Min: $($SummaryUTCTime.Minimum.ToString())”
Write-Host “Max: $($SummaryUTCTime.Maximum.ToString())”
Write-Host “VMHosts reported Times :Min and Max date/time while creating this report”
Write-Host “Min: $($SummaryVMHostTime.Minimum.ToString())”
Write-Host “Max: $($SummaryVMHostTime.Maximum.ToString())”
Write-Host “Time Difference between VMHost and UTC from local os time Min, Max, Avg”
Write-Host “Min: $($SummaryDiffToUTC.Minimum.ToString())”
Write-Host “Max: $($SummaryDiffToUTC.Maximum.ToString())”
Write-Host “Avg: $($SummaryDiffToUTC.Average.ToString())”
if($CheckTimeFromInternet){
[datetime]$TimeFromInternet=(Invoke-RestMethod -Uri ‘http://www.earthtools.org/timezone/52.35000/4.86660’).timezone.utctime
$CurrentSystemTimeUTC=(Get-Date).ToUniversalTime()
Write-Host “We took UTC time from internet and compared it to your local time converted to UTC time”
$TimeDiff=[math]::abs(($CurrentSystemTimeUTC-$TimeFromInternet).TotalSeconds)
Write-Host “Reported local time converted to UTC $CurrentSystemTimeUTC”
Write-Host “Reported time taken from internet(http://www.earthtools.org/webservices.htm) $TimeFromInternet”
Write-Host “Difference: $TimeDiff seconds”
}
}
return $TimeReport | Sort-Object -Property DiffToUTC
}
[/sourcecode]
2 comments
Hi there, Nice script.
I tried to use it today and it looks like earthtools have changed there setup, so I swapped out the rest method for worldclockapi.com.
(Invoke-RestMethod -Uri http://worldclockapi.com/api/json/utc/now).currentDateTime
Best Regards
Gary
Thank you Gary !