AutomationVMware

VMware PowerCLI ile ESXi Toplu NTP Güncelleme ve Slack Bildirimi

Bu makalede vSphere ortamında eşlenik bir NTP yapısına sahip olmayan ESXi hostlar için olası bir zaman senkronizasyonu problemlerini önlemek adına PowerCLI ile toplu olarak NTP konfigürasyonunu nasıl güncelleyebileceğimizden bahsedeceğim.

Ekstra bir ayar yapılmadığı sürece vSphere ortamındaki sanal makinelerin açılış anında tarih ve saat bilgilerini üzerinde çalıştığı ESXi host üzerinden aldığını biliyoruz. Hal böyleyken vSphere ortamındaki ESXi hostlardaki NTP ayarlarında farklılıklar var ise ileride sanal makineleri olumsuz yönde etkileyebilir. Bu durum aynı zamanda uygulama seviyesinde de tutarsızlığa neden olabilir. NTP konfigürasyonu her ne kadar basit bir ayar olsa bile gözden kaçan eksiklikler ya da eşlenik olmayan tarih ve saat bilgileri troubleshoot ve audit işlemlerinizi daha da zorlaştıracaktır. Bu nedenle tüm hostlar üzerindeki NTP ayarlarını eşlenik ve doğru tutmak gerekir.

Aşağıda paylaşacağım kodların hepsini içeren projeye Github profilimden ulaşabilirsiniz. Bu script içerisinde belirleyeceğiniz birincil ve ikincil NTP adresleriyle beraber ESXi hostlarınızdaki NTP adresleri eşlenik olmayan hostları Slack kanalınıza bildirim olarak alabilirsiniz. Aynı zamanda otomatik olarak NTP adreslerini düzeltmek isterseniz de $remediateNTP değişkenini $true yapmanız yeterli olacaktır.

PowerShell
$vcenter = "vCenterFQDN" # Your vCenter name -  vcenter.domain.local
$user = "username" # Your vCenter username - administrator@vsphere.local or domain\username
$password = "password" # Your vCenter password
$NTPAddr = "0.tr.pool.org", "8.8.8.8" # Your Primary and Secondary NTP server
$uriSlack = "https://..." # Your Slack URI
$locationText = $emoji + "Location: HQ - Production vCenter" + "`n"; # Your Location Title
$remediateNTP = $false ### If you do not want to auto remediate please keep this value as $false.
$emoji = ':information_source: '
$emojiRemediate = ':white_check_mark: '

Aşağıdaki kod bloğunda tanımlamış olduğunuz birincil ve ikincil NTP adreslerine göre vCenter altındaki tüm ESXi hostlar için foreach döngüsünde NTP adreslerinin doluluk ve eşlenik durumunlarını kontrol edip bunları değişkende topluyoruz.

PowerShell
 foreach ($esxi in $NTPSettings) {
    if ($null -eq $esxi.NTPServers) {
        $NTPState = "null"
        $HostNTPNull += $esxi.Name + "`n"
        remediateControl $esxi.Name $esxi.NTPServers $NTPState
    }
    elseif ($esxi.NTPServers -is [array]) {
        if (($esxi.NTPServers[0] -ne $NTPAddr[0]) -or ($esxi.NTPServers[1] -ne $NTPAddr[1]) ) {
            $NTPState = "update-array-ntp"
            $HostNTPArray += $esxi.Name + " : Current: " + $esxi.NTPServers[0] + "," + $esxi.NTPServers[1] + " > Expected : " + $NTPAddr[0] , $NTPAddr[1] + "`n"
            remediateControl $esxi.Name $esxi.NTPServers $NTPState
        }
        else {
            Write-Host "NTP settings are OK for" $esxi.Name -ForegroundColor Cyan
        }  
    }
    else {
        if ($esxi.NTPServers -ne $NTPAddr[0]) {
            $NTPState = "update-string-ntp"
            $HostNTPString += $esxi.Name + " : Current: " + $esxi.NTPServers + " > Expected : " + $NTPAddr[0], $NTPAddr[1] + "`n"
            remediateControl $esxi.Name $esxi.NTPServers $NTPState
        }
        else {
            $NTPState = "update-string-ntp-secondary"
            $HostNTPStringSecondary += $esxi.Name + " : Current: " + $esxi.NTPServers + " > Expected : " + $NTPAddr[0], $NTPAddr[1] + "`n"
            remediateControl $esxi.Name $esxi.NTPServers $NTPState
        }
    }
} 

Yukarıda toplamış olduğumuz bilgileri switch case inde problemin tipine göre ESXi host üzerinde NTP güncellemesini yapıp sonuçlarını Slack kanalına gönderiyoruz.

PowerShell
 function remediateControl {
    param([string]$currentHost, [array]$currentNTPServer, [string]$NTPState)  
    if ($remediateNTP -eq $true) {
        Write-Host "Remediations will be applied to" $currentHost -ForegroundColor Cyan
        $action = ' *has been successfully remediated with expected NTP configurations!*' + "`n" ;
        switch ($NTPState) {
            'null' { 
                Add-VmHostNtpServer -NtpServer $NTPAddr -VMHost $currentHost | Out-Null
                $remediationText = $emojiRemediate + '*' + $currentHost + '*' + $action 
            }
            'update-array-ntp' {
                Get-VMHost -Name $currentHost | Remove-VMHostNtpServer -NtpServer $currentNTPServer -confirm:$false | Out-Null
                Add-VmHostNtpServer -NtpServer $NTPAddr -VMHost $currentHost | Out-Null
                $remediationText = $emojiRemediate + '*' + $currentHost + '*' + $action    
            }
            'update-string-ntp' { 
                Get-VMHost -Name $currentHost | Remove-VMHostNtpServer -NtpServer $currentNTPServer -confirm:$false | Out-Null
                Add-VmHostNtpServer -NtpServer $NTPAddr -VMHost $currentHost | Out-Null
                $remediationText = $emojiRemediate + '*' + $currentHost + '*' + $action       
            }
            'update-string-ntp-secondary' { 
                Add-VmHostNtpServer -NtpServer $NTPAddr[1] -VMHost $currentHost | Out-Null
                $remediationText = $emojiRemediate + '*' + $currentHost + '*' + $action    
            }
        }
        restartNTPService $currentHost
        sendSlack $remediationText
    } 

Belirtmiş olduğumuz NTP bilgileri ile beraber vCenter altında bu değerlere sahip olmayan ESXi host listesini Slack üzerinde bildirimini sağlıyoruz.

Eğer $remediateNTP değeri $true ise ilgili hostlarda NTP değerlerini güncelledikten sonra Slack üzerinde aşağıdaki gibi bir bildirim alacaksınız.

Makale içerisindeki kullanılan scriptlere aşağıdaki Github profilimden ulaşabilirsiniz.

https://github.com/vmbro/PowerCLI-ESXi-NTPConfiguration

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir