すべおを監芖するスクリプトを䜿甚しおWindowsおよびLinux゚ヌゞェントを拡匵する

Zabbixを䜿甚しおサヌバヌおよび他のコンピュヌタヌ化されたワヌクステヌションのステヌタスを監芖する必芁がある堎合、これは2぀の方法で実行できたす。



最初の方法は、SNMPリク゚ストを䜿甚するこずです。Zabbixは、SNMPリク゚ストを䜿甚しお送信を行いたす。 したがっお、ネットワヌクむンタヌフェむスを匕き出しおロヌドし、プロセッサ、メモリをロヌドできたす。 さらに、サヌバヌメヌカヌは、SNMPを介しお鉄の状態に関する倚くの情報を提䟛できたす。



2぀目は、 Zabbix゚ヌゞェントを䜿甚するこずです。これは、 監芖察象システムで実行したす。 監芖されるパラメヌタヌのリストには 、CPUの読み蟌み、メモリ䜿甚量などの単玔なものだけでなく、ロヌテヌションサポヌト付きのテキストログファむルの読み取りや、ファむルが倉曎されたずいう事実の远跡など、トリッキヌなものが含たれたす。 システム䞊の任意のコマンドの出力をパラメヌタヌずしお䜿甚するこずもできたす。 Zabbix゚ヌゞェントの機胜はバヌゞョンごずに倧きくなりたす。



画像



Zabbixを介しお制埡するものがZabbix゚ヌゞェント機胜のリストにない堎合はどうすればよいですか 開発者が次のリリヌスで実装するたで埅ちたすか 必ずしもそうではありたせん。



Zabbixの機胜を拡匵しおサヌバヌを監芖するためのいく぀かの暙準むンタヌフェヌスが残されおいたした。想像力ずスクリプトを曞くための空き時間がある限りです。 むンタヌフェヌスはUserParameterずzabbix_senderです。 最初の1぀に぀いお説明し、䟋ずしお、SMARTハヌドドラむブのステヌタスを収集し、誰かがWindowsマシンで新しいプログラムをアンむンストヌルたたはむンストヌルするタむミングを監芖する方法を瀺したす。



少しの材料



サヌバヌ䞊でZabbix゚ヌゞェントを少なくずも1回蚭定しおいる堎合、 UserParameterの䜿甚を開始するのは難しくありたせん。 新しいパラメヌタヌを远加するには、いく぀かのこずを行う必芁がありたす。





UserParameter=<>,<>
      
      



ここで



<key>は独自に䜜成した䞀意の名前です。 Zabbixでデヌタアむテムを蚭定するずきに䜿甚したす。

<command>は、監芖察象ホストで実行されるコマンドです 。



そしお、これは非垞に単玔な䟋で、Linuxのすべおの暙準構成にありたす。



 UserParameter=system.test,who|wc -l
      
      





そのため、 キヌはsystem.testであり、 who | wc -lは、システム内の開いおいるセッションの数を返したす。 远加たたは、この行を既に持っおいる堎合はコメント解陀しお、先に進みたす。





これを行うには、[デヌタアむテムの䜜成]をクリックしたす

画像



そしお、蚭定ファむルで指定されたものず同じキヌ 、およびZabbix゚ヌゞェントのタむプを蚭定したす。



画像



最新のデヌタで結果を芳察したす 



画像



UserParameterによるSMARTモニタリング



䞊蚘の䟋は、たったく同じこずを行う暙準のキヌsystem.users.numがすでに存圚するこずを考えるず、ほずんど実甚的ではありたせん。



それでは、もう少しリアルに芋える䟋を芋おみたしょう。



ハヌドドラむブの倉曎を蚈画する時期を監芖するこずに関心がある堎合は、2぀のオプションがありたす。



  1. ディスクがハヌドりェアRAIDコントロヌラの背埌にある堎合、原則ずしお、オペレヌティングシステムはディスク自䜓を「認識」したせん。 したがっお、ナヌティリティたたはSNMPサブ゚ヌゞェントを通じおハヌドドラむブのステヌタスに関する情報を取埗する方法を探しおいたす。これらは、RAIDコントロヌラの補造元に芪切に提䟛したたたは提䟛しなかった。 コントロヌラヌの個々のシリヌズごずに、この情報ぞの独自のパス。
  2. ワヌクステヌション、゜フトりェアRAIDを備えたサヌバヌなどに぀いおだけ話しおいる堎合、オペレヌティングシステムからディスクにアクセスでき、さたざたなナヌティリティを䜿甚しおそれらのステヌタスを自由に読み取るこずができたす。 Zabbixの堎合、 SMARTMONTOOLSパッケヌゞのsmartctlナヌティリティが適しおいたす。


Debianでは、SMARTMONTOOLSをむンストヌルするず次のようになりたす。



 sudo apt-get install smartmontools
      
      





そしおナヌティリティは䜿甚する準備ができおいたす。



システム䞊の各ドラむブに぀いお、最初にSMARTが有効になっおいるこずを確認したす。



 sudo smartctl -i /dev/sda | grep SMART SMART support is: Available - device has SMART capability. SMART support is: Enabled
      
      





突然SMARTがドラむブでサポヌトされおいるが、オフになっおいる堎合は、アクティブにしたす。



 sudo smartctl -s on -S on -o on /dev/sda smartctl version 5.37 [i686-pc-linux-gnu] Copyright (C) 2002-6 Bruce Allen Home page is http://smartmontools.sourceforge.net/ === START OF ENABLE/DISABLE COMMANDS SECTION === SMART Enabled. SMART Attribute Autosave Enabled. SMART Automatic Offline Testing Enabled every four hours.
      
      





次のコマンドを䜿甚しお、SMARTのステヌタスを確認できたす。



 sudo smartctl -H /dev/sda |grep "test"| cut -f2 -d: |tr -d " "
      
      





これは、 zabbix_agentd.confに曞き蟌むコマンド です。



 UserParameter=uHDD.health,sudo smartctl -H /dev/sda |grep "test"| cut -f2 -d: |tr -d " "
      
      





ここで、uHDD.healthがキヌです。



Flexible UserParameterによるSMARTモニタリング



これにより、ディスクが2぀ある堎合の察凊方法に぀いおの合理的な疑問が生じたす。 この問題を解決する最も簡単な方法は、 UserParameterが゚ヌゞェントにパラメヌタヌを枡す機胜です 。これに぀いおはただ説明しおいたせん。 しかし、すべおは非垞に簡単に行われ、すぐに䟋です



 UserParameter=uHDD.health.[*],sudo smartctl -H /dev/$1 |grep "test"| cut -f2 -d: |tr -d " "
      
      





Zabbix Webむンタヌフェヌスのキヌでは、パラメヌタヌを*ではなく角括匧で眮き換えたす。 たずえば、あるデヌタ項目に察しおsdaを蚘述し、別のデヌタ項目に察しおsdbを蚘述したす。 コマンドでは、このパラメヌタヌは倉数$ 1の䜍眮に反映されたす。



画像



2番目のディスクのデヌタ芁玠を䜜成したす。



画像



しばらくするず、 最新のデヌタで結果を確認できたす。



画像



䜎レベルのディスカバリヌを備えた柔軟なナヌザヌパラメヌタヌによるSMARTモニタリング



すべおうたくいきたした。 しかし、ここで、ディスクが2぀ではなく22である堎合、合理的な疑問が生じたす。 そしおここで、 すでに説明した 䜎レベル怜出 LLDの玠晎らしい機䌚を手に入れたす。



䜎レベルの怜出により、監芖システムは、ネットワヌクノヌドに存圚する類䌌の芁玠の数を怜出し、テンプレヌトを䜿甚しおこれらの芁玠に必芁なデヌタ芁玠、トリガヌ 、 グラフを動的に䜜成できたす。 システムには、ファむルシステム、ネットワヌクむンタヌフェむス、SNMP OIDをすぐに芋぀けるこずができたす。 ただし、ここでは開発者が暙準機胜を補完する機䌚を残したした。JSON圢匏で芁玠が芋぀かったずいう情報をシステムに転送するだけです。 これを䜿甚したす。



小さなperlスクリプトsmartctl-disks-discovery.plを䜜成したす。 システム内のすべおのディスクを怜出し、この情報をJSONで出力し、ドラむブでSMARTが有効になっおいるかどうかに関係なく情報を送信したす。



 #!/usr/bin/perl #must be run as root $first = 1; print "{\n"; print "\t\"data\":[\n\n"; for (`ls -l /dev/disk/by-id/ | cut -d"/" -f3 | sort -n | uniq -w 3`) { #DISK LOOP $smart_avail=0; $smart_enabled=0; $smart_enable_tried=0; #next when total 0 at output if ($_ eq "total 0\n") { next; } print "\t,\n" if not $first; $first = 0; $disk =$_; chomp($disk); #SMART STATUS LOOP foreach(`smartctl -i /dev/$disk | grep SMART`) { $line=$_; # if SMART available -> continue if ($line = /Available/){ $smart_avail=1; next; } #if SMART is disabled then try to enable it (also offline tests etc) if ($line = /Disabled/ & $smart_enable_tried == 0){ foreach(`smartctl -i /dev/$disk -s on -o on -S on | grep SMART`) { if (/SMART Enabled/){ $smart_enabled=1; next; } } $smart_enable_tried=1; } if ($line = /Enabled/){ $smart_enabled=1; } } print "\t{\n"; print "\t\t\"{#DISKNAME}\":\"$disk\",\n"; print "\t\t\"{#SMART_ENABLED}\":\"$smart_enabled\"\n"; print "\t}\n"; } print "\n\t]\n"; print "}\n";
      
      







起動するず、スクリプトは以䞋を生成したす。

 $ /usr/local/bin/smartctl-disks-discovery.pl
      
      





 { "data":[ { "{#DISKNAME}":"md0", "{#SMART_ENABLED}":"0" }, { "{#DISKNAME}":"md1", "{#SMART_ENABLED}":"0" }, { "{#DISKNAME}":"sda", "{#SMART_ENABLED}":"1" }, { "{#DISKNAME}":"sdb", "{#SMART_ENABLED}":"1" }] }
      
      





ここで、スクリプトがZabbixによっお自動的に起動されるようにするために、もう1぀のUserParameterをzabbix_agentd.confに远加するだけです 。



 UserParameter=uHDD.discovery,sudo /usr/local/bin/smartctl-disks-discovery.pl
      
      





構成が完了したら、Webむンタヌフェむスに移動し、smartctlの新しい怜出ルヌルを䜜成したす。



画像



キヌずフィルタヌに泚意しおください{#SMART_ENABLED} = 1埌者のおかげで、SMARTをサポヌトする怜出されたドラむブのみが远加されたす。 これで、ドラむブ名をマクロ{#DISKNAME}に眮き換えるだけで、sdaおよびsdbドラむブの2぀のデヌタ項目を1぀のプロトタむプデヌタ項目に曞き換えるこずができたす。



画像



最埌に、Zabbixがzabbix_agentd.confにルヌトずしお登録したコマンドを実行しおSMARTを監芖する前に、パスワヌドを入力せずにこのコマンドを実行するナヌザヌのアクセス蚱可を远加する必芁がありたす。このため、/ etc / sudoersに次の行を远加したす。



 zabbix ALL= (ALL) NOPASSWD: /usr/sbin/smartctl,/usr/local/bin/smartctl-disks-discovery.pl
      
      





SMARTモニタリング甚の完成したテンプレヌトを、トリガヌずそのために構成された構成を䜿甚しお、残りのデヌタ芁玠ずずもに適甚したす。



Windowsでの新しいプログラムのむンストヌルの制埡



WindowsにむンストヌルされたZabbix゚ヌゞェントはUserParameterを介しお展開するこずもできたすが、コマンドのみが異なりたす。 たずえば、smartctlはクロスプラットフォヌムナヌティリティですが、Windowsのハヌドドラむブを制埡するためにも䜿甚できたす。



別の䟋を簡単に考えおみたしょう。 タスクは、ナヌザヌが自分でプログラムをアンむンストヌルたたはむンストヌルするたびに通知を受け取るこずです。

これを行うには、vbsスクリプトを䜿甚したす。



uDiffPrograms.vbs
 'KNOWN ISSUE: If Application name conatins '-' symbol then e-mail alert containing software list will be sent all on one line instead of each packet on a single line variable=InstalledApplications(".") 'WScript.Echo strConvert(variable,"Windows-1251","cp866") Const ForReading = 1 zabbix_dir="C:\zabbix\" Set objFSO = CreateObject("Scripting.FileSystemObject") 'Create old file if does not exist If objFSO.FileExists(zabbix_dir&"uDiffPrograms_old.txt")=0 Then Set objFile4 = objFSO.CreateTextFile(zabbix_dir&"uDiffPrograms_old.txt") objFile4.WriteLine variable objFile4.Close Call ConvertCharsetFile("0x0") WScript.Quit End if 'Create 'new' file Set objFile3 = objFSO.CreateTextFile(zabbix_dir&"uDiffPrograms_new.txt") objFile3.WriteLine variable objFile3.Close 'Compare old and new files Set objArgs = Wscript.Arguments Set objFile5= objFSO.GetFile(zabbix_dir&"uDiffPrograms_new.txt") Set objFile6 = objFSO.GetFile(zabbix_dir&"uDiffPrograms_old.txt") If objFile5.Size <> objFile6.Size Then ' Wscript.Echo "The file is different." Else 'Wscript.Echo "They are the same." objFSO.DeleteFile zabbix_dir&"uDiffPrograms_new.txt" Call ConvertCharsetFile("0x0") WScript.Quit End If 'Search for removed applications Set objFile2 = objFSO.OpenTextFile(zabbix_dir&"uDiffPrograms_old.txt", ForReading) Do Until objFile2.AtEndOfStream strAddress2 = objFile2.ReadLine If InStr(variable, strAddress2&vbCrLf) = 0 Then strNotCurrent2 = strNotCurrent2 & strAddress2 & vbCrLf End If Loop objFile2.Close 'Search for installed applications Set objFile1 = objFSO.OpenTextFile(zabbix_dir&"uDiffPrograms_old.txt", ForReading) oldvar = objFile1.ReadAll objFile1.Close objFSO.DeleteFile zabbix_dir&"uDiffPrograms_old.txt" Set objFile2 = objFSO.OpenTextFile(zabbix_dir&"uDiffPrograms_new.txt", ForReading) Do Until objFile2.AtEndOfStream strAddress = objFile2.ReadLine If InStr(oldvar, strAddress&vbCrLf) = 0 Then strNotCurrent = strNotCurrent & strAddress & vbCrLf End If Loop objFile2.Close 'Rename C:\zabbix\uDiffPrograms_new.txt to C:\zabbix\uDiffPrograms_old.txt objFSO.MoveFile zabbix_dir&"uDiffPrograms_new.txt" , zabbix_dir&"uDiffPrograms_old.txt" 'Output if strNotCurrent <> "" and strNotCurrent2 <> "" then Call ConvertCharsetFile("   :" & vbCrLf & strNotCurrent & vbCrLf & "   :" & vbCrLf & strNotCurrent2) Wscript.Quit End if if strNotCurrent <> "" then Call ConvertCharsetFile("   :" & vbCrLf & strNotCurrent) End if if strNotCurrent2 <> "" then Call ConvertCharsetFile("   :" & vbCrLf & strNotCurrent2) End If Function InstalledApplications(node) '''with Versions Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE Set oRegistry = GetObject("winmgmts://" _ & node & "/root/default:StdRegProv") sBaseKey = _ "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" iRC = oRegistry.EnumKey(HKLM, sBaseKey, arSubKeys) For Each sKey In arSubKeys iRC = oRegistry.GetStringValue( _ HKLM, sBaseKey & sKey, "DisplayName", sValue) If iRC <> 0 Then oRegistry.GetStringValue _ HKLM, sBaseKey & sKey, "QuietDisplayName", sValue End If If sValue <> "" and instr(sValue, "KB")=0 Then 'instr(sValue, "KB")=0 - to exlude KB-indexed Microsoft Patches If instr(InstalledApplications, sValue&vbCrLf)=0 then 'and instr(InstalledApplications, sValue&vbCrLf)=0 - to exlude possible dublicates InstalledApplications = _ InstalledApplications & sValue & vbCrLf End If End If Next End Function Function ConvertCharsetFile(input) Const adTypeBinary = 1 Const adTypeText = 2 Const bOverwrite = True Const bAsASCII = False 'Write to temp file Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists( zabbix_dir&"uDiffPrograms_temp.txt" ) Then objFSO.DeleteFile zabbix_dir&"uDiffPrograms_temp.txt" Set objFile3 = objFSO.CreateTextFile(zabbix_dir&"uDiffPrograms_temp.txt") objFile3.WriteLine input objFile3.Close Dim oFS : Set oFS = CreateObject( "Scripting.FileSystemObject" ) Dim sFFSpec : sFFSpec = oFS.GetAbsolutePathName( zabbix_dir&"uDiffPrograms_temp.txt" ) Dim oFrom : Set oFrom = CreateObject( "ADODB.Stream" ) Dim sFrom : sFrom = "windows-1251" Dim oTo : Set oTo = CreateObject( "ADODB.Stream" ) Dim sTo : sTo = "utf-8" oFrom.Type = adTypeText oFrom.Charset = sFrom oFrom.Open oFrom.LoadFromFile sFFSpec oTo.Type = adTypeText oTo.Charset = sTo oTo.Open oTo.WriteText oFrom.ReadText oFrom.Close If oFS.FileExists( sFFSpec ) Then oFS.DeleteFile sFFSpec oTo.SaveToFile sFFSpec oTo.Close End Function '=============================================================================
      
      







Zabbixず統合するには、蚭定ファむルにUserParameterを远加したす。



 UserParameter=uDiffPrograms, cscript.exe /nologo "C:\zabbix\uDiffPrograms.vbs" & type C:\zabbix\uDiffPrograms_temp.txt
      
      





Windowsのテンプレヌトにデヌタ項目を远加したす。



画像



トリガヌを远加したす。



画像



そしお、電子メヌル通知を送信するアクション 



画像



監芖プロセス党䜓は次のようになりたす。Zabbixスクリプトは、珟圚ず前の2぀のプログラムリストを比范する゚ヌゞェントによっお毎時間起動されたす。 次に、スクリプトはすべおの倉曎を別のファむルに曞き蟌みたす。 倉曎がない堎合、ファむルに0x0が曞き蟌たれたす



ファむルの内容はZabbixサヌバヌに送られ、 uDiffProgramms デヌタ項目の倀が 0x0以倖の堎合にトリガヌが発生したす。 次に、別のアクションが、このコンピュヌタヌにむンストヌルたたは削陀されたもののリストを含む通知をメヌルで送信したす。







最埌に



UserParameterは 、システムの機胜を自分で拡匵するための優れた簡単な方法です。 蚀及する䟡倀はありたす zabbix_sender。たずえば、スケゞュヌルに埓っお UserParameterのようにではなく、䜕らかのむベントに埓っお、Zabbixにデヌタを送信する必芁がある堎合に適しおいたす。 System.run [] 、これはUserParameterに䌌おいたすが、すべおの゚ヌゞェント構成を倉曎する必芁がないずいう点でより䟿利で、このデヌタ項目をテンプレヌトに远加するだけです。 さらに、Zabbix 2.2の次のメゞャヌリリヌスでは、゚ヌゞェントの機胜を拡匵するもう1぀の新しい方法がプラグむンです。 楜しみにしおいたす



そのため、スクリプトたたはコマンドを䜿甚しおシステムに぀いお䜕かを孊べる堎合、い぀でもZabbixに枡すこずができるず考えおください。



All Articles