Zabbixを使用してMicrosoft ADのクライアントPCを監視します。 パート2-テンプレート、スクリプト、LLD

Zabbixには、すぐに使用できる多くの可能性がありますが、これでは十分ではない場合があります。この場合、サードパーティのスクリプトを使用してイベントを処理することができます(スクリプトに問題を報告)。 あとでスクリプト自体に戻りますが、説明にトリガーを追加する理由と理由を明確にするために、主なアイデアのみを説明します。 スクリプトはメッセージの本文を解析し、行MYparsBLOCKを検索します:funcname:見つかった場合はfuncname()を実行し、見つからない場合はアラートを送信します。 これをトリガーの説明に追加するのが最も合理的です。そのため、Actions-Event source –Triggers-operationsでは、デフォルトメッセージに{TRIGGER.DESCRIPTION}を追加する必要があります。



料理テンプレート



自動登録ルールを使用して新しいホストに添付される監視テンプレートを作成する必要があります。 (アクション->イベントソース->自動登録->テンプレートへのリンク:Win_monitor)私は、Windows用の標準的なzabbixテンプレートと、青からどこかからのAPC Smart UPS Monitoringを基本として、それらから不要なものをすべて取り出して追加しました私が必要です。



アイテム
エージェントのping

agent.ping

平均ディスクキュー長

perf_counter [\ 234(_Total)\ 1400]

平均ディスク読み取りキューの長さ

perf_counter [\ 234(_Total)\ 1402]

平均ディスク書き込みキューの長さ

perf_counter [\ 234(_Total)\ 1404]

CPUモデル

wmi.get [ROOT \ cimv2、Win32_Processorから名前を選択]

CPU使用率

perf_counter [\ 238(_Total)\ 6]

APC Smart UPSモニタリング:ドライバーキャプション

wmi.get [ROOT \ cimv2、Win32_PNPEntity WHERE PNPDeviceID LIKE '%VID_051D&PID_0002%'またはService LIKE '%hidbatt%'からのキャプションを選択]

Cの空きディスク容量:

vfs.fs.size [c :、無料]

Cの空きディスク容量:(パーセント)

vfs.fs.size [c:、pfree]

空きメモリ

vm.memory.size [無料]

実行中のzabbix_agentdのホスト名

agent.hostname

メインボードモデル

wmi.get [ROOT \ cimv2、Win32_BaseBoardから製品を選択]

システム情報

system.uname

システム稼働時間

system.uptime

Cの合計ディスク容量:

vfs.fs.size [c :、合計]

総メモリ

vm.memory.size [合計]

Cの使用済みディスク領域:

vfs.fs.size [c :、使用済み]

APC Smart UPSモニタリング:バッテリー寿命

battery.runtime

APC Smart UPS監視:バッテリー交換日

battery.mfr.date

APC Smart UPSモニタリング:バッテリー充電

バッテリー充電

APCスマートUPS監視:UPSモデル

ups.model

APC Smart UPSモニタリング:負荷

ups.load

APC Smart UPSモニタリング:電圧(入力)

入力電圧

APC Smart UPSモニタリング:電圧(出力)

出力電圧

APC Smart UPS監視:UPSステータス

ups.status

APC Smart UPS監視:ビープステータス

ups.beeper.status

APC Smart UPS監視:バッテリー温度

バッテリー温度



トリガー
ボリュームCの空きディスク容量が1GB未満です:{HOST.NAME}

{Win_monitor:vfs.fs.size [c :, free] .last(0)} <1073741824

{HOST.NAME}の空きメモリが不足しています

{Win_monitor:vm.memory.size [free] .avg(30m)} <10000000

APCスマートUPS監視:robot_ UPSデータが{HOST.NAME}に届かない

{Win_monitor:ups.status.str(Error)} = 1および{Win_monitor:wmi.get [ROOT \ cimv2、Win32_PNPEntity WHERE PNPDeviceID LIKE '%VID_051D&PID_0002%'またはService LIKE '%hidbatt%']からキャプションを選択します。 )}> 1

{HOST.NAME}のZabbixエージェントは7日間到達不能です

{Win_monitor:agent.ping.nodata(7d)} = 1

APC Smart UPS監視:{HOST.NAME}でバッテリーが充電されません

{Win_monitor:battery.charge.max(#120)} <90

APCスマートUPS監視:{HOST.NAME}でビープ音がオフ

{Win_monitor:ups.beeper.status.str(無効)} = 1

APC Smart UPS監視:{HOST.NAME}のバッテリー寿命が短い

{Win_monitor:battery.runtime.last(0)} <5および{Win_monitor:ups.model.str(Smart)} = 1



UPSを監視するというアイデアの実装は、私たちが望むほどスムーズではないことが判明したことはすでに書いています。 エラーが絶えず発生するため、devconユーティリティを使用してドライバーを再起動すると役立つため、nutp関数を使用したブロックをトリガーに追加します(説明中)。 さて、監視に死んだホストは必要ありません。そのため、トリガー「{HOST.NAME}のZabbixエージェントは7日間到達できません」で、remove_offline関数を追加して、zabbixからホストを削除します。



MYparsBLOCK:nutpt: HIP:{HOST.DNS} MYparsBLOCK:remove_offline: HID:{HOST.NAME}
      
      





低レベルの発見



スマートに関しては、通常のアイテムとトリガーは機能しません。マシンごとに異なる数のスマートを使用できるためです。 zabbixでは、低レベルのディスカバリルールを使用して取得したオブジェクトのリスト用に作成されるアイテムとトリガープロトタイプを作成できます 。詳細については、こちらを参照してください。 ルールを機能させるには、起動時に特別なJSON形式でハードのリストを生成するスクリプト/アプリケーションを作成する必要があります。 最初にPowerShellでスクリプトを作成しましたが、PowerShell自体が非常に長い時間初期化されていたため、一部のマシンでは30秒で定期的にスクリプトを実行する時間がありませんでした。 私はpowershellをあきらめて、c#でexeアプリケーションを作成しなければなりませんでした(わかりませんが、スクリプトを書き直すのに十分簡単なように見えました)。 smartctlを使用するアプリケーションはhddリストを受け取り、重複を(シリアルで)削除し、必要な形式で表示します。



hddscan.cs
 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Text.RegularExpressions; namespace hdd_scan { class Program { static string[] smartctl(string arg) { Process p = new Process(); p.StartInfo.FileName = "C:\\Program Files\\Zabbix\\extra\\smart\\smartctl.exe"; p.StartInfo.Arguments = arg; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.Start(); string output = p.StandardOutput.ReadToEnd(); string[] list = output.Split('\n'); p.WaitForExit(); return list; } static void Main(string[] args) { try { string[] hddlist = smartctl("--scan"); Dictionary<string, string> psarr = new Dictionary<string, string>(); string pattern = @"^(?<1>\/[\w]+)\/(?<xer>[\S]+)\s"; foreach (string hdd in hddlist) { var match = Regex.Match(hdd, pattern); if (match.Success) { string shdd = match.Groups["xer"].Value; string[] tmp = smartctl("-a " + shdd); foreach (string line in tmp) { if (line.Contains("Serial") == true) { string[] serials = Regex.Split(line, @"^Serial\sNumber\:\s+"); if (serials.Length < 2) continue; string serial = serials[1]; if (!psarr.ContainsValue(serial)) { psarr.Add(shdd, serial); } } } } } //Starting output int cnt = 0; Console.WriteLine("{\n"); Console.WriteLine("\t\"data\":[\n\n"); foreach (KeyValuePair<string, string> kvp in psarr) { string[] flist = smartctl("-a "+kvp.Key); string checkstring = "A mandatory SMART command failed: exiting. To continue, add one or more '-T permissive' options."; // bool test= false; for (int i = 0; i < flist.Length; i++) { if (flist[i].Contains(checkstring)) { test = true; } } if (!test) { cnt++; if (cnt > 1) { Console.WriteLine("\t,\n"); } Console.WriteLine("\t{\n"); Console.WriteLine("\t\t\"{{#HDDNAME}}\":\"{0}\"\n", kvp.Key); Console.WriteLine("\t}\n"); } } Console.WriteLine("\n\t]\n"); Console.WriteLine("}\n"); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
      
      







はい、一部のマシンではスマートを無効にすることができるため、関数firstrunをもう1つ追加し、自動登録ルールのメッセージに配置しますアクション->イベントソース->自動登録スクリプトを介して...



 MYparsBLOCK:firstrun: HIP:{HOST.IP}
      
      





テンプレートで、discoveyルール-smart.discoveryを作成します。



アイテムのプロトタイプ
smart _ {#HDDNAME} _CRC_Error_Count

スマート[{#HDDNAME}、crc]

smart _ {#HDDNAME} _Current_Pending_Sector

スマート[{#HDDNAME}、保留]

smart _ {#HDDNAME} _Health_Status

スマート[{#HDDNAME}、ヘルス]

smart _ {#HDDNAME} _Model

スマート[{#HDDNAME}、モデル]

smart _ {#HDDNAME} _Reallocated_Sector_Ct

スマート[{#HDDNAME}、realloc]

smart _ {#HDDNAME} _Temperature

スマート[{#HDDNAME}、temp]



プロトタイプをトリガーします
HDD:{#HDDNAME} {HOST.NAME}のCurrent_Pending_Sectorは5より大きい

{Win_monitor:smart [{#HDDNAME}、pend] .last()}> 5

HDD:{#HDDNAME} {HOST.NAME}のReallocated_Sector_Ctは5より大きい

{Win_monitor:smart [{#HDDNAME}、realloc] .last()}> 5

HDD:{#HDDNAME} {HOST.NAME}のハードドライブ温度が55度を超えています

{Win_monitor:smart [{#HDDNAME}、temp] .last()}> 55

HDD:{#HDDNAME} {HOST.NAME}のCRC_Error_Countの成長を修正

{Win_monitor:smart [{#HDDNAME}、crc] .change()}> 0

HDD:Current_Pending_Sectorは、{#HDDNAME} {HOST.NAME}の増加を記録しました

{Win_monitor:smart [{#HDDNAME}、pend] .change()}> 0および{Win_monitor:smart [{#HDDNAME}、pend] .last()}> 6

HDD:{#HDDNAME} {HOST.NAME}でReallocated_Sector_Ctの増加を記録

{Win_monitor:smart [{#HDDNAME}、realloc] .change()}> 0および{Win_monitor:smart [{#HDDNAME}、realloc] .last()}> 6



プロトタイプの説明では、hddsmart関数を追加します。smartctlはsda、sdbなどを使用するため、HDDモデルをトリガーメッセージの本文に追加し、話しているハードドライブの種類を明確にします。



 MYparsBLOCK:hddsmart: HIP:{HOST.DNS}:KKEY:smart[{#HDDNAME},model]
      
      





エージェントはほとんどのパラメーターを理解しないため、すべてのUserParameterをクライアント構成に登録する必要があります。



ユーザーパラメータ
UserParameter=battery.charge,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.charge

UserParameter=battery.charge.low,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.charge.low

UserParameter=battery.charge.warning,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.charge.warning

UserParameter=battery.mfr.date,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.mfr.date

UserParameter=battery.runtime,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.runtime

UserParameter=battery.runtime.low,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.runtime.low

UserParameter=battery.temperature,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.temperature

UserParameter=battery.type,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.type

UserParameter=battery.voltage,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.voltage

UserParameter=battery.voltage.nominal,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost battery.voltage.nominal

UserParameter=input.sensitivity,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost input.sensitivity

UserParameter=input.transfer.high,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost input.transfer.high

UserParameter=input.transfer.low,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost input.transfer.low

UserParameter=input.voltage,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost input.voltage

UserParameter=output.current,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost output.current

UserParameter=output.frequency,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost output.frequency

UserParameter=output.voltage,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost output.voltage

UserParameter=output.voltage.nominal,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost output.voltage.nominal

UserParameter=ups.beeper.status,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.beeper.status

UserParameter=ups.delay.shutdown,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.delay.shutdown

UserParameter=ups.delay.start,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.delay.start

UserParameter=ups.firmware,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.firmware

UserParameter=ups.firmware.aux,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.firmware.aux

UserParameter=ups.load,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.load

UserParameter=ups.mfr,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.mfr

UserParameter=ups.mfr.date,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.mfr.date

UserParameter=ups.model,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.model

UserParameter=ups.productid,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.productid

UserParameter=ups.serial,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.serial

UserParameter=ups.status,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.status

UserParameter=ups.test.result,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.test.result

UserParameter=ups.timer.reboot,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.timer.reboot

UserParameter=ups.timer.shutdown,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.timer.shutdown

UserParameter=ups.timer.start,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.timer.start

UserParameter=ups.vendorid,"c:\Program Files (x86)\NUT\bin\upsc.exe" primary@localhost ups.timer.vendorid

UserParameter=smart[*],"C:\Program Files\Zabbix\cmd\smart.cmd" "$1" $2

UserParameter=smart.discovery, "C:\Program Files\Zabbix\cmd\hdd_scan.exe"







smart.cmd
 @echo off rem use smart.cmd <disk> < parameter> smart.cmd sda health cd "C:\Program Files\Zabbix\cmd" if %2==health ("C:\Program Files\Zabbix\extra\smart\smartctl.exe" -H %1 | grep result | awk "{print $6}") if %2==model ("C:\Program Files\Zabbix\extra\smart\smartctl.exe" -i %1 | grep "Device Model" | awk -F"Device Model:" "{print $2}") if %2==realloc ("C:\Program Files\Zabbix\extra\smart\smartctl.exe" --attributes %1 | grep Reallocated_S | awk "{print $10}") if %2==crc ("C:\Program Files\Zabbix\extra\smart\smartctl.exe" --attributes %1 | grep CRC | awk "{print $10}") if %2==pend ("C:\Program Files\Zabbix\extra\smart\smartctl.exe" --attributes %1 | grep Pend | awk "{print $10}") if %2==temp ("C:\Program Files\Zabbix\extra\smart\smartctl.exe" --attributes %1 | grep Temperature_Celsius | awk "{print $10}")
      
      







警告スクリプト



実際にスクリプト自体は、文字を送信して機能を実行します。



 #!/usr/bin/env python # -*- coding: utf-8 -*- #/var/lib/zabbixsrv/alertscripts/mail.py import string import re import subprocess import sys import time import os #    ,  ,    def send_mail(recipient, subject, body): import smtplib from email.MIMEText import MIMEText from email.Header import Header from email.Utils import formatdate encoding='utf-8' SMTP_SERVER = 'smtp' SENDER_NAME = u'Zabbix Alert' session = None msg = MIMEText(body, 'plain', encoding) msg['Subject'] = Header(subject, encoding) msg['From'] = Header(SENDER_NAME, encoding) msg['To'] = recipient msg['Date'] = formatdate() try: session = smtplib.SMTP(SMTP_SERVER) session.sendmail(SENDER_NAME, recipient, msg.as_string()) except Exception as e: raise e finally: # close session if session: session.quit() # Zabbix     ,   ,     .(  ,   ) def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): try: pid = os.fork() if pid > 0: sys.exit(0) except OSError, e: sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror)) sys.exit(1) os.chdir("/") os.umask(0) os.setsid() try: pid = os.fork() if pid > 0: sys.exit(0) except OSError, e: sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror)) sys.exit(1) for f in sys.stdout, sys.stderr: f.flush() si = file(stdin, 'r') so = file(stdout, 'a+') se = file(stderr, 'a+', 0) os.dup2(si.fileno(), sys.stdin.fileno()) os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(se.fileno(), sys.stderr.fileno()) #     def hddsmart(): m=re.search('MYparsBLOCK\:\S+\:\s+HIP\:(?P<hostip>\S+)\:KKEY\:(?P<kkey>\S+)',a3) hostip,kkey= m.group('hostip'),m.group('kkey') p = subprocess.Popen('zabbix_get -s '+hostip+' -k '+kkey, shell=True,stdout=subprocess.PIPE) bb = a3[0:string.find(a3,'MYparsBLOCK')] + 'HDD: ' + p.stdout.read() send_mail(sys.argv[1],a2,bb) #    .    api    def remove_offline(): if 'PROBLEM:' in a2: m=re.search('MYparsBLOCK\:\S+\:\s+HID\:(?P<hostid>\S+)',a3) hostid = m.group('hostid') + '\n' hidf=open('/var/log/zabbixsrv/2del_ids', 'a') hidf.write(hostid) hidf.close send_mail(sys.argv[1],a2,a3[0:string.find(a3,'MYparsBLOCK')]) # ,       .      microsoft devcon. def nutpt(): if 'PROBLEM:' in a2: m=re.search('MYparsBLOCK\:\S+\:\s+HIP\:(?P<hostip>\S+)',a3) hostip = m.group('hostip') log = '' i = 0 while i < 5: p = subprocess.Popen("""zabbix_get -s %s -k 'system.run[net stop "Network UPS Tools"]'"""%(hostip), shell=True,stdout=subprocess.PIPE) log +=p.stdout.read() time.sleep(10) p = subprocess.Popen("""zabbix_get -s %s -k system.run['cd "C:\Program Files\Zabbix\cmd\"&devcon.exe restart USB\VID_051D*']"""%(hostip), shell=True,stdout=subprocess.PIPE) log +=p.stdout.read() time.sleep(30) p = subprocess.Popen("""zabbix_get -s %s -k 'system.run[net start "Network UPS Tools"]'"""%(hostip), shell=True,stdout=subprocess.PIPE) log +=p.stdout.read() i += 1 p = subprocess.Popen("""zabbix_get -s %s -k 'ups.status'"""%(hostip), shell=True,stdout=subprocess.PIPE) if 'Error' not in p.stdout.read(): i = 8 if i <> 8: send_mail(sys.argv[1],a2,log) #    .     smart   smartctl.exe --scan-open def firstrun(): m=re.search('MYparsBLOCK\:\S+\:\s+HIP\:(?P<hostip>\S+)',a3) hostip = m.group('hostip') p = subprocess.Popen("""zabbix_get -s %s -k system.run['cd "C:\Program Files\Zabbix\extra\smart\"&smartctl.exe --scan-open']"""%(hostip), shell=True,stdout=subprocess.PIPE) log = p.stdout.read() send_mail(sys.argv[1],a2,log) daemonize(stdout='/var/log/zabbixsrv/script_out.log', stderr='/var/log/zabbixsrv/script_err.log') try: a1,a2,a3 = sys.argv[1],sys.argv[2],sys.argv[3] #debug(      ) #os.system('echo "' + a1+' '+a2+' '+a3 +'" >> /var/log/zabbixsrv/script_dbg.log') if 'MYparsBLOCK' in a3: eval(re.search('MYparsBLOCK\:(?P<myfunc>\S+)\:',a3).group('myfunc'))() #      else: send_mail(sys.argv[1],a2,a3) except: #print sys.exc_info() send_mail('admin@domain.local', 'Error in script', str(sys.exc_info()))
      
      





複数の受信者がいる場合、関数は数回実行されることに注意してください。 一部の場合、これは関連性があり(たとえば、HDDモデル)、何らかの理由で有害になる場合があるため、アクションをセットアップする際にこれを考慮する必要あります。



非アクティブなホストを削除するスクリプト



 #!/usr/bin/python # import os from pyzabbix import ZabbixAPI, ZabbixAPIException try: os.rename ('/var/log/zabbixsrv/2del_ids','/var/log/zabbixsrv/klist_pr') except: pass user='apirobot' pwd='*******' url = 'https://127.0.0.1/zabbix/' zh = ZabbixAPI(url) zh.session.verify = False zh.login(user=user, password=pwd) f = open('/var/log/zabbixsrv/klist_pr') for hnm in f: try: hid = zh.host.get(filter={"host":hnm.replace('\n','')},output=['hostid'])[0]['hostid'] #zh.host.delete(hostid = hid) - API change zh.host.delete(int(hid)) except: pass f.close() os.remove('/var/log/zabbixsrv/klist_pr')
      
      





スクリプトを機能させるには、マシンを削除する権限を持つアカウントが必要です。 ここではパスワードがクリアテキストで保存されているため、別のアカウントでクラウンでスクリプトを実行します。



DNS名でエージェントを接続する



デフォルトでは、zabbixがIP経由でエージェントに接続するようにエージェントが登録されます。 これは私には合わないので、修正するスクリプトを作成し、同時にルックアップの問題を報告します。 私はpyzabbixの例からスクリプトを基礎として使用し、それを少しやり直しました。



use_fqdn.py
 #!/usr/bin/python # # -*- coding: utf-8 -*- import socket from getpass import getpass from pyzabbix import ZabbixAPI, ZabbixAPIException zapi = ZabbixAPI(server='https://127.0.0.1/zabbix/') zapi.session.verify = False zapi.login('apirobot', '*******') body = '' err = '' def send_mail(recipient, subject, body): import smtplib from email.MIMEText import MIMEText from email.Header import Header from email.Utils import formatdate encoding='utf-8' SMTP_SERVER = 'smtp' SENDER_NAME = u'zabbix@domain.local' MAIL_ACCOUNT = 'zabbix@domain.local' session = None msg = MIMEText(body, 'plain', encoding) msg['Subject'] = Header(subject, encoding) msg['From'] = Header(SENDER_NAME, encoding) msg['To'] = recipient msg['Date'] = formatdate() try: session = smtplib.SMTP(SMTP_SERVER) session.sendmail(MAIL_ACCOUNT, recipient, msg.as_string()) except Exception as e: raise e finally: # close session if session: session.quit() # Loop through all hosts interfaces, getting only "main" interfaces of type "agent" for h in zapi.hostinterface.get(output=["dns","ip","useip"],selectHosts=["host"],filter={"main":1,"type":1}): #print h # Make sure the hosts are named according to their FQDN # if len(h['dns']) == 0: try: zapi.hostinterface.update(interfaceid=h['interfaceid'], dns = socket.gethostbyaddr(h['hosts'][0]['host'])[0]) except: body += ('FQDN_UPD_ERR: ' + h['hosts'][0]['host']) + '\n' try: a = socket.gethostbyaddr(h['hosts'][0]['host'])[2][0] b = socket.gethostbyaddr(h['dns'])[2][0] if (a != b): body += ('Warning: %s has dns "%s"' % (h['hosts'][0]['host'], h['dns'])) + '\n' except: body += ('DNS_LOOKUP_ERR: ' + h['hosts'][0]['host']) + '\n' # Make sure they are using hostnames to connect rather than IPs (could be also filtered in the get request) if h['useip'] == '1': body += ('%s is using IP instead of hostname. Fixing.' % h['hosts'][0]['host']) + '\n' try: zapi.hostinterface.update(interfaceid=h['interfaceid'], useip=0) except ZabbixAPIException as e: #print(e) err += str(e)+'\n' err += '\n' continue body += '\nZabbix Errors:' + err if len(body) > 16: send_mail('admin@domain.local','check agents',body)
      
      





追記



»すべてのスクリプト、テンプレート、およびその他の必要なファイルはgithubに投稿されます。



» Zabbixを使用して、Microsoft ADのクライアントPCを監視します。 パート1-自動インストール




All Articles