4 Ekim 2012 Perşembe

Zabbix ile windows update kontrolü

Bu makalede Zabbix Agent ile Windows sunucularınızın güncelleştirmelerini ve sunucunuzun yeniden başlatılma gereksinimini nasıl kontrol edeceğinizi anlatacağım.

Öncelikle, Zabbix Agent içerisinde doğrudan bu güncelleştirme ve yeniden başlatma kontrolü olmadığını söyleyeyim. bunun için Zabbix Agent'ın UserParameter özelliğini kullanacağız.

Zabbix Agent UserParameter özelliği ile varsayılan olarak kontrol edemediğimiz özellikleri, kendi yazdığımız scriptleri kullanarak kontrol edebiliyoruz.

UserParameter parametresi Zabbix Agent konfigürasyon dosyası içine yazılarak kullanılıyor. Kullanım şekli aşağıdaki gibi.

UserParameter=<key>,<command>

Örneğin

UserParameter=deneme, %systemroot%\system32\cscript.exe /nologo C:\Zabbix\deneme.vbs

Yukarıdaki örnekte Zabbix Server içerisinde Item oluştururken kullanacağımız key deneme oluyor ve bu key karşılığında alacağımız değeri de deneme.vbs dosyası veriyor. Bu deneme.vbs içine yazacağımız fonksiyon da bize kalıyor.

Windows güvenlik güncelleştirmelerini kontrol eden scripti yazmadan önce şöyle bir bilgi vereyim. Windows Update kontrolü bir script ile 20-40 saniye arasında sürüyor. Bu aslında büyük bir rakam. Zabbix sunucunuz yüzlerce kontrol yaparken böyle bir kontrol için bu kadar zaman harcaması doğru olmaz.

İşte bu yüzden biz windows güncelleştirme kontrolünü doğrudan Zabbix Agent'a yaptırmayacağız. Bunun yerine kontrolleri bir script aracılığı ile ve windowsun kendi zamanlayıcısını kullanarak bir txt dosyaya yazdıracağız. Zabbix Agent ise bu dosyayı okuyacak. bu sayede Zabbix sorgusu çok hızlı olacak ve Zabbix sunucumuzun performansını windows update kontrolü ile düşürmemiş olacağız.

Şimdi ilk olarak windows güncelleştirmelerini kontrol edecek ve sonrasında bir dosyaya yazacak scripti yazalım.

Daha önceden Zabbix ile ilgili dosyalarımın olduğu yere, yani C:\Zabbix klasörü içine checkwinupdates.vbs isimli bir dosya kaydedelim. Dosyanın içeriği aşağıdaki gibi olacak.



ssWindowsUpdate   = 2 
updatesHigh = 0
updatesOptional = 0

Set objSysInfo = CreateObject("Microsoft.Update.SystemInfo")
Set updateSession = CreateObject("Microsoft.Update.Session") 
Set updateSearcher = updateSession.CreateupdateSearcher() 

updateSearcher.ServerSelection = ssWindowsUpdate 

Set objResults = updateSearcher.Search("IsInstalled=0") 

Set colUpdates = objResults.Updates
Set WSHShell = CreateObject("WScript.Shell")

For i = 0 to colUpdates.Count - 1
If (colUpdates.Item(i).IsInstalled = False AND colUpdates.Item(i).AutoSelectOnWebSites = False) Then
updatesOptional = updatesOptional + 1
ElseIf (colUpdates.Item(i).IsInstalled = False AND colUpdates.Item(i).AutoSelectOnWebSites = True) Then
updatesHigh = updatesHigh + 1
End IF
    
Next

updatesTotal = (updatesHigh + updatesOptional)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile("C:\Zabbix\winupdateresult.txt", True)
    
IsRequired = 0
If objSysInfo.RebootRequired = "True" Then
    IsRequired = 1
End If

' Önce güvenlik güncelleştirme sayısını yazalım
objTextFile.Write(updatesHigh)
' daha sonra satır atlayarak sistemin yeniden başlatılması ile ilgili bilgiyi yazalım
objTextFile.Write(vbCrLf & IsRequired)

objTextFile.Close

WScript.Quit 0


Yukarıdaki script içinde dikkat ederseniz updatesOptional diye bir seçenek de var. Ben sadece önemli güvenlik güncelleştirmelerini kontrol etmek istediğim için bu değeri yazdırmıyorum. Değerleri yine C:\Zabbix içinde winupdateresult.txt dosyasına yazıyorum.

Bu script çalıştığında winupdateresult.txt dosyasına iki satır kaydediyor. İlk satırda kaç güvenlik güncelleştirmesinin olduğu bilgisi, ikinci satırda ise sitemin yeniden başlatılma ihtiyazının olup olmadığı numerik olarak kydediliyor.

0 - yeniden başlatmaya ihtiyaç yok
1 - yeniden başlatmaya ihtiyaç var

Scripti çalıştırmadan önce C:\Zabbix klaösrüne winupdateresult.txt isimli dosyayı oluşturmayı unutmayın. Şimdi scripte çift tıklayarak çalışıp çalışmadığını test edebilirsiniz. Daha önce söylediğim gibi yaklaşık 20-40 saniye arasında sürüyor çalışması.

Not: Eğer scripti çalıştırdığınızda Set objResults = objSearcher.Search("IsInstalled=0") satırında hata veriyorsa, bilgisayarınız windows update için WSUS Server kullanıyor olabilir. Bunu anlamak için Windows Update'i açtığınızda pencerenin alt kısmında "You recieve updates : managed by your system administrator" yazıyorsa WSUS kullanıyorsunuz veya önceden kullanmışsınız ve ayarlarınız böyle kalmış demektir. Bunu düzeltmek için regedit içerisinde aşağıdaki anahtarın değerini 0 yapıp, sistemi yeniden başlatmalısınız.

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU

Eğer script düzgün çalışıp sonuçları dosyaya yazdıysa, şimdi bu scripti zamanlamaya geçebiliriz. Bunu için windowsun Task Scheduler özelliğini kullanacağız.

Start > Control Panel > Administrative Tools > Task Scheduler programını açalım.

Test yaptığım makina Windows 7 Pro işletim sistemine sahip.

Task Scheduler açıldığında sağ menüden Create Task diyelim.


Açılan pencerede Name kısmına istediğimiz bir ismi verelim. Örneğin CheckWinUpdates. Daha sonra aşağıdan "Run whether user is logged on or not" işaretleyelim. Yine "Run with highest privileges" işaretleyelim. Bu sekmede diğer seçenekleri olduğu gibi bırakarak Trigger sekmesine geçelim.


Triggers sekmesinde zamanlamayı ayarlayacağız. New diyerek yeni bir zamanlama penceresi açıp uygun zamanlamayı yapalım ve ok diyelim. Benim için günde bir kez çalışması yeterli. Siz kendinize göre bu zamanlamayı ayarlayabilirsiniz.



Daha sonra Action sekmesine geçelim. Burada yine New diyerek yeni bir aksiyon tanımlayalım. Action kısmı "Start a program" kalacak. Program seçme bölümünden C:\Zabbix altındaki checkwinupdates.vbs dosyamızı seçelim. Start in (optional) kısmına C:\Zabbix\ yazalım ve ok diyelim.


Bunun dışındaki sekmelerde bir şey yapmadan ok diyerek görev zamanlayıcımızı kapatalım. Çalıştığından emin olmak için yeni oluşturduğumuz görevin üzerine sağ clik yapıp Run diyebilirsiniz.

Böylece günde bir kez scriptimizin çalışmasını sağlamış olduk. Sıra bu scriptin çalışması sonucunda ortaya çıkan sonuçların Zabbix Agent tarafından okunmasına geldi.

Önce winupdateresult.txt dosyasının istediğimiz satırını okuyarak Zabbix Agent'a gönderecek scripti yazalım. Bu scripti yine C:\Zabbix altına getwinupdates.vbs ismiyle kaydedelim.

Scriptin içeriği aşağıdaki şekilde olacak.


Dim ArgObj
Set ArgObj=Wscript.Arguments
Const ForReading = 1

ArgWanted = ArgObj.Item(0)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("C:\Zabbix\winupdateresult.txt", ForReading)

strLine = 100

If ArgWanted = "updates" Then
    strLine = objTextFile.ReadLine
ElseIf ArgWanted = "reboot" Then
    objTextFile.ReadLine
    strLine = objTextFile.ReadLine
End If

Wscript.Echo strLine

objTextFile.Close


Script içine bir parametre göndereceğiz. Bu sayede güncelleştirmeler ve yeniden başlatma bilgisini tek bir script ile okuyabileceğiz. Dilerseniz her bir bilgi için ayrı bir scripte yazabilirsiniz. Dikkat ederseniz biz iki parametre göndereceğiz. Eğer parametremiz updates ise bize güncelleştirme bilgisini, reboot ise yeniden başlatma bilgisini verecek. Eğer bunlar haricinde bir parametre gelirse bize 100 rakamını döndürecek. Bu sayede doğru bilgi almadığımızı da görmüş olacağız.

Şimdi sıra geldi ZAbbix Agent konfigürasyonuna. Bunun için Zabbix Agent konfigürasyon dosyasını açalım. Benim dosyam C.\Zabbix\zabbix_conf.txt

Konfigürasyon dosyasnın en sonuna aşağıdaki satırı ekleyelim.

UserParameter=check.winupdate[*], %systemroot%\system32\cscript.exe /nologo c:\Zabbix\getwinupdates.vbs $1

<key> yerine check.winupdate[*] yazdık. Köşeli parantez kullanarak parametre göndereceğimizi belirtmiş oluyoruz. <command> sonundaki $1 ise gönderdiğimiz parametreyi vbs dosyasına iletecek.

Konfigürasyon dosyasını kaydedip kapatalım ve Zabbix Agent servisini yeniden başlatalım. Dikkat, konfigürasyon dosyasında yaptığınız değişikliklerin aktif olması için servisi yeniden başlatmalısınız.

Zabix Agent'ın çalıştığından emin olmak için komut satırından aşağıdaki komut ile test gerçekleştirebiliriz.

Not: cmd programını yönetci olarak çalıştırmalısınız.

cd C:\Zabbix diyerek Agent'ımızın olduğu kalsöre gidelim.


zabbix_agentd.exe -c c:\zabbix\zabbix_conf.txt -t check.winupdate[updates]

Eğer herşey yolunda ise bize [t:3] gibi bir sonuç dönecek. 3 rakamı 3 güncelleştirme olduğunu gösteriyor.

Şimdi sıra geldi, Zabbix Server da bir Item yaratmaya. Bunun için hostumuzun içindeki Itemlara girip Create Item diyelim ve aşağıdaki değerleri kullanalım.

Type : Zabbix Agent
Key : check.winupdate[updates] veya check.winupdate[reboot] (ihtiyaca göre)
Type of information : Numeric (unsigned)
Data type : decimal
Update Interval : 86400 (günde bir kez yeterlidir)


Save diyerek kaydedelim. Artık windows güncelleştirmelerini ve sistemin yeniden başlama ihtiyacını kontrol ediyorsunuz.







Hiç yorum yok:

Yorum Gönder