Bagaimana kami melakukan pemantauan jaringan untuk 14.000 objek

Kami memiliki 14.000 objek, zabbix, api, python, dan keengganan untuk menambahkan objek dengan tangan. Di bawah potongan - tentang bagaimana manajer jaringan menerapkan pemantauan dengan penambahan otomatis node jaringan, dan sedikit tentang rasa sakit yang harus saya alami.

Artikel ini lebih berfokus pada insinyur jaringan dengan sedikit pengalaman python. Untuk membantu otomatisasi pemantauan dan peningkatan kualitas hidup dan pekerjaan, dengan tidak adanya kebutuhan untuk memperbarui secara manual seluruh armada benda.



Singkat cerita, kami telah membangun pemantauan


Hai Nama saya Alexander Prokhorov, dan bersama-sama dengan tim insinyur jaringan di departemen kami, kami mengerjakan jaringan di # ITX5. Departemen kami mengembangkan infrastruktur jaringan, pemantauan jaringan, dan otomatisasi. Ya, dan segala sesuatu yang terkait dengan transfer data.



Saya akan memecah sistem pemantauan menjadi 5 subtugas:

  • Unduh Data Master
  • Memperoleh informasi tentang keadaan benda
  • Pemicu dan Peringatan
  • Pelaporan
  • Visualisasi

Dalam artikel ini kami ingin berbagi bagaimana kami melakukan integrasi pemantauan dengan data master di perusahaan kami.

Kami memiliki 14.000 properti ritel, dan tugas pertama yang kami selesaikan adalah penentuan objek yang tidak dapat diakses, jumlah dan distribusi geografisnya.

Pemantauan dilakukan pada Zabbix . Singkatnya mengapa - beruntung dan warisan. Sisanya:

Ceritanya panjang.
Semuanya dimulai dengan pemasangan pemantauan pada komputer di bawah meja ...

Ketika saya mulai bekerja untuk perusahaan pada tahun 2013, kami tidak memiliki pemantauan jaringan, meskipun jaringan itu pada saat itu besar, sekitar 4000 objek. Kami belajar tentang penurunan besar (dan tidak begitu) paling sering dari penerimaan aplikasi, pengguna, atau dari departemen lain seperti longsoran salju.



Yang pertama dipasang Zabbix 1.8, sebagai produk yang mendapatkan momentum (modis, modern, muda), ringan dan terjangkau untuk menginstal open source dengan komunitas besar. Kami hanya beruntung dengan pilihan itu.

Tidak ada sumber daya untuk instalasi, tidak ada yang meminta. Tidak jelas apakah ini akan berhasil, tidak ada yang punya pengalaman implementasi. Tetapi kami membutuhkan, dan kami menginstalnya di komputer "di bawah meja." Tingkat Redundansi - UPS.

Pertanyaan utama setelah instalasi adalah bagaimana cara menuangkan semua objek (4k!) Ke dalam pemantauan, dan pada saat yang sama berhasil membuat aplikasi yang sudah menggantung di Remedy. Zabbix sudah mendukung impor / ekspor xml dengan data pada host. Jumlah objek besar, tidak ada gunanya membuat grup terpisah untuk objek (dan itu tidak muncul), dan diputuskan untuk mengunggah router objek sebagai node jaringan. Lebih banyak peralatan jaringan tidak terkontrol (sudah dikelola).

Parsing file kami dengan host jaringan (IPAM di excel) telah selesai, dan diformat ulang menjadi xml, yang disetujui Zabbix untuk dicerna. Bukan yang pertama, tetapi semua host dimuat, memperbarui dilakukan setiap tiga bulan sekali, menghapus objek yang ditutup dan menambahkan yang baru. Seiring waktu, ternyata Zabbix menjadi sumber informasi utama dan satu-satunya bagi kami dan hotline tentang ketersediaan fasilitas dan, yang paling penting, tentang penurunan massa. Ini memungkinkan hotline untuk mengetahui tentang kecelakaan massal bahkan di malam hari, dan untuk membangunkan insinyur dengan panggilan (omong-omong, ketika tidak ada yang tahu tentang itu, lebih mudah untuk hidup). Tidak selalu pemadaman listrik malam hari di kantor memungkinkan UPS memelihara pemantauan jaringan kami secara memadai. Pada titik tertentu, kami mulai membuat cadangan. Karena pemantauan tidak stabil dan terputus-putus, perusahaan memutuskan untuk mengatur kelompok yang didedikasikan untuk tugas ini saja. Segera, dia mulai menerapkan Zabbix terpusat, yang memeriksa tidak hanya jaringan.

Zabbix tua kami terus hidup di bawah meja. Setelah menambahkan sejumlah item, basis data mulai melambat sedikit, web, antrian dan jajak pendapat bertambah, jadi saya harus segera mendapatkan dua komputer lagi sebagai proxy dan meletakkan semuanya di salib, sehingga reservasi sebenarnya (dan tempat di bawah meja sudah selesai) . Kehidupan di dalamnya didukung untuk dengan cepat menambahkan semacam parameter khusus ke pemantauan dan mengamatinya. Untuk sisanya, kami pindah ke yang terpusat.

Pemantauan terpusat bertanggung jawab atas semua peralatan TI - router, server, register kas, terminal. Setelah beberapa saat, dia ditumbuhi banyak barang. Untuk mengakses informasi aksesibilitas yang tak ternilai, Anda harus menunggu sedikit, mungkin bahkan minum kopi. Selain itu, kami memiliki lebih banyak persyaratan untuk pemantauan jaringan yang lebih spesifik dan khusus. Memiliki pada saat itu beberapa pengalaman bekerja dengan sistem, kami memutuskan untuk melakukan implementasi lama dari awal, tetapi memang demikian - dengan nama zabbix.noc.x5.ru Itu terletak di pusat data dengan implementasi fungsi yang diperlukan oleh diri kita sendiri. Tentang pengantar ini dan bagian utama dari artikel ini.

Versi Zabbix adalah 3.0 LTS . Diperbarui hanya dalam versi LTS.

Konfigurasi - 4 mesin virtual: Server + Database, Proxy, Proxy, Web

Dari sumber daya, kami mencoba mengikuti rekomendasi di zabbix.com untuk implementasi yang besar dan sangat besar.

Masalah pertama yang dihadapi kami adalah penambahan otomatis node jaringan ke pemantauan. Penemuan Biasa menghilang dengan segera. Jangkauan jaringan kami ada di semua ruang terbuka supernet 10/8. Banyak alamat yang harus disurvei dan penemuan otomatis akan memakan banyak sumber daya sistem, tetapi tidak akan menyelesaikan masalah dengan menambahkan informasi non-teknis tentang suatu objek.

Bagaimana cara menambahkan objek


Solusinya adalah menggunakan skrip eksternal untuk menambahkan objek. Data master tentang objek perdagangan ditemukan di SAP yang digunakan di perusahaan. Akses yang disinkronkan ke layanan web untuk mengunggah data langsung dari SAP tidak keluar, permintaan untuk semua objek memakan waktu cukup lama. Melakukan panggilan asinkron. Tepat di tengah malam, ekspor penuh dari SAP ditambahkan ke ftp dalam bentuk XML , dan pada siang hari XML dengan perbedaan dari versi terbaru jatuh di atasnya.

Zabbix menggunakan Zabbix API untuk memuat data, dan berinteraksi dengannya dari Python .

Pada tahap pertama, kumpulan data yang kami butuhkan untuk membuat objek ditentukan. Kami menggunakan semua tanda yang diperoleh untuk klasifikasi objek yang benar dalam sistem atau untuk kenyamanan lebih lanjut. Tanda-tanda ini termasuk:

  • Alamat IP - bidang yang paling penting untuk membuat antarmuka pemantauan
  • SAP ID - kami memiliki pengidentifikasi objek yang unik
  • Status - terbuka / tertutup
  • Nama - nama atau nomor objek, sering digunakan oleh pengguna saat menghubungi
  • Lokasi - alamat fisik
  • Telepon - telepon kontak
  • Grup - grup grup ini dibentuk berdasarkan jenis dan lokasi objek



Modul Sap-sync.py


XML dari SAP
<?xml version="1.0" encoding="ISO-8859-1"?> <werks> <WERKS>1234</WERKS> <NAME1>4321-</NAME1> <PLANT_IP>192.168.1.50</PLANT_IP> <REGION>31</REGION> <PSTLZ>308580</PSTLZ> <CITY1>.</CITY1> <CITY2> .</CITY2> <STREET> .</STREET> <HOUSE_NUM1>1</HOUSE_NUM1> <TEL_NUMBER>(999)777-77-77</TEL_NUMBER> <BRANCH>CH</BRANCH> <REGION>CH_MSK</REGION> <REGION_NAME> </REGION_NAME> <FORMAT>CH_MSK_D</FORMAT> <STATUS> </STATUS> </werks> 


sap-sync.py
 #!/usr/bin/python3 import sys, os, getopt, ipaddress from datetime import datetime as dt from zabbix.api import ZabbixAPI import xml.etree.cElementTree as et from report import report import existhost def ping(ip): if os.system('ping -c 2 -W 1 %s > /dev/null'%ip) == 0: return True else: return False def main(argv): global opath try: opts, args = getopt.getopt(argv,"hp:",["path="]) except getopt.GetoptError: print('sync-sap-chg.py -p <path>') sys.exit(2) for opt, arg in opts: if opt == '-h': print('sync-sap-chg.py -p <path>') sys.exit() elif opt in ("-p", "--path"): opath = arg def asynchronization(file, reportdata): zapi = ZabbixAPI(url='http://z.noc.x5.ru', user='user', password='pwd') #,    left_kidney = '17855' right_kidney = '17856' f_type={'S':'Super','D':'DK','H':'Giper','A':'DK'} format={'D':'13','S':'14','H':'12','A':'13'} region={'CT':'21','UR':'19','SZ':'17',~omit~} try: #  XML tree = et.ElementTree(file=file) root = tree.getroot() for werks in root.iter('werks'): #     Zabbix interfaces=[{ 'main':'1', 'type':'2', 'useip':'1', 'port':'161' }] shop={ 'inventory':{}, 'interfaces':interfaces, 'groups':[], 'templates':[{'templateid':'10194'}], 'inventory_mode':'1' } #,     XML di = { 'WERKS':'', ~omit~, 'STATUS':'Object Opened' } #    for item in werks: di[item.tag] = item.text #  SAPID   if item.tag == 'WERKS': n_proxy = ''.join(filter(lambda x: x.isdigit(), item.text)) # IP    .   /26 try: ipaddress.ip_interface('%s/%s'%(di['PLANT_IP'].strip(),26)) ip_chk = True except: ip_chk = False # ,   IP   if (di['PLANT_IP'] != '1.1.1.1') and ip_chk: #    if di['FORMAT'][-1] in ['D','A','S','H']: shop['inventory']['alias']=di['WERKS'] shop['inventory']['name']=di['NAME1'] shop['inventory']['poc_1_phone_a']=di['TEL_NUMBER'] shop['inventory']['location']=di['STREET'] #    if (di['FORMAT'][-1] in ['H']): shop['host']=f_type[di['FORMAT'][-1]]+di['WERKS'] shop['interfaces'][0]['ip']=str(ipaddress.ip_interface('%s/%s'%(di['PLANT_IP'].strip(),24)).network[1]) # ID     shop['templates'][0]['templateid']='29529' elif (di['FORMAT'][-1] in ['S']): ~omit~ #For D balance in proxies if int(n_proxy[-1]) % 2 == 0: shop['proxy_hostid'] = right_kidney else: shop['proxy_hostid'] = left_kidney # inventory   IP shop['inventory']['oob_ip']=shop['interfaces'][0]['ip'] #    format  region shop['groups']=[{'groupid':'9'}] shop['groups'].append({'groupid':format[di['FORMAT'][-1]]}) shop['groups'].append({'groupid':region[di['FORMAT'][:2]]}) #   if di['STATUS'] == ' ': shop['status']='0' else: shop['status']='1' #   T = dt.date(dt.now()).strftime("%d %B %Y") shop['inventory']['date_hw_decomm'] = T #      Zabbix hostid = existhost.exist(shop['host']) ip = shop['interfaces'][0]['ip'] #  - ! if hostid == 0 and shop['status'] == '0' and ping(ip): zapi.host.create(shop) reportdata['new'].append(di['WERKS']) #   - ! elif hostid != 0 and di['PLANT_IP'] != '1.1.1.1': #  HOSTID  shop['hostid']=hostid #     shop.pop('interfaces') zapi.host.update(shop) reportdata['update'].append(di['WERKS']) #     os.system('mv %s /mnt/ftp/old_data/'%(file)) except: reportdata['error'].append(di['WERKS']) report('   %s.   :%s'%(file, str(reportdata['error'])), 'SAP Sync Failed!') sys.exit() def checking(path): files = os.listdir(path) files.sort() reportdata ={'new':[], 'update':[], 'error':[]} for file in files: asynchronization(path+file, reportdata) if files != []: report(' %s  ! \n  %s . \n  sap:\n %s. \n  %s . \n  sap:\n %s'%(str(files), len(reportdata['new']), str(reportdata['new']), len(reportdata['update']), str(reportdata['update'])), 'SAP Sync Succeed!') if __name__ == "__main__": main(sys.argv[1:]) checking(opath) 


Tujuan utama dari modul ini adalah parsing XML dan terjemahan JSON untuk Zabbix API. Sangat nyaman dalam hal ini untuk menggunakan kamus Python, sebagai tidak perlu memformatnya tambahan - menggunakan modul zabbix.api , Anda cukup memberinya kamus dengan struktur yang benar. JSON dengan strukturnya terlihat seperti ini:

 { 'host': 'Hostname' 'groups': [...] 'interfaces': [{},{},{}] 'inventory': {} 'templates': [{},{},{}] 'inventory_mode': '1' 'proxy_hostid': 'INT' 'status': '0' } [] -  {} -  

Di bidang kami dengan alamat IP di SAP, alamat server disimpan, bukan router, tetapi menggunakan modul ipaddress kami menganggap alamat subnet pertama, yang dalam kasus kami selalu merupakan router.

 str(ipaddress.ip_interface('%s/%s'%(di['PLANT_IP'].strip(),24)).network[1]) 

Tanggal pembaruan terakhir yang berhasil dicatat dalam Inventaris , dalam situasi kontroversial membantu untuk memahami seberapa relevan informasi dalam sistem.

 #   T = dt.date(dt.now()).strftime("%d %B %Y") shop['inventory']['date_hw_decomm'] = T 

Maka sangat nyaman untuk melihat statistik pada tanggal pembaruan dalam data inventaris:



Bidang yang paling penting - STATUS , "terbuka" - ditambahkan dan mulai dipantau, status lainnya - menonaktifkan host. Kami tidak menghapus objek untuk menjaga data historis dan statistik.

Setelah tes, saya harus menambahkan fungsi ping untuk memeriksa apakah host dapat diakses sebelum penambahan awal, karena dalam praktiknya, status "Terbuka" mulai menjumpai, yang belum cukup terbuka, tetapi hampir.

 def ping(ip): if os.system('ping -c 2 -W 1 %s > /dev/null'%ip) == 0: return True else: return False 

Sebelumnya, Zabbix API memiliki fungsi host.exist , tetapi dalam versi baru dikombinasikan dengan host.get . Jika node ada, maka permintaan mengembalikan hostid di database zabbix. Jika tidak ditemukan, mengembalikan 0. Untuk verifikasi, saya sekarang harus menambahkan existhost , tetapi sebenarnya itu adalah host.get .

existhost.py
 #!/usr/bin/python3 import sys, getopt from zabbix.api import ZabbixAPI def main(argv): global aname try: opts, args = getopt.getopt(argv,"hn:",["name="]) except getopt.GetoptError: print('existhost.py -n <name>') sys.exit(2) for opt, arg in opts: if opt == '-h': print('existhost.py -n <name>') sys.exit() elif opt in ("-n", "--name"): aname = arg def exist(name): zapi = ZabbixAPI(url='http://z.noc.x5.ru/', user='user', password='pwd') hostget = zapi.host.get(search={'name':'%s'%name}, output='hostid') if hostget == []: return 0 else: return int(hostget[0]['hostid']) if __name__ == "__main__": main(sys.argv[1:]) print(exist(aname)) 


Akhirnya, kami mengumpulkan informasi tentang pekerjaan yang dilakukan, menambahkannya ke log, melaporkan, dan memindahkan file yang diproses ke repositori di OLD.

report.py
 #!/usr/bin/python3 # -*- coding: utf-8 -*- import smtplib, sys from email.mime.text import MIMEText def report(message, subject): me = 'zbx-scripts@x5.ru' you = 'mail@x5.ru' smtp_server = 'smtp.ru' msg = MIMEText(message) msg['Subject'] = subject msg['From'] = me msg['To'] = you s = smtplib.SMTP(smtp_server) s.sendmail(me, [you], msg.as_string()) s.quit() if __name__ == '__main__': report(sys.argv[2], sys.argv[1]) 


Secara umum, basis pemantauan siap, jalankan skrip di cron untuk autorun dan lupakan.



Cara mengisi inventaris


Kita bukan lagi kita, kita adalah penggiat jejaring.

Tahap kedua adalah mengisi objek dengan data yang perlu dilakukan oleh para insinyur. Penting untuk melihat semua data untuk menyelesaikan insiden dalam satu sistem, agar tidak berjalan di sistem yang berbeda, mengumpulkan informasi dalam potongan-potongan dari sumber yang berbeda. Dan karena data teknis utama dalam pemantauan, kami juga menarik sisanya ke dalam pemantauan.
Untuk mengumpulkan dan mengirimkan informasi yang diperlukan, Zabbix menulis inventory.py , yang sebagian besar terlibat dalam pengumpulan data SNMP dari peralatan, dan pada tingkat yang lebih rendah menguraikan file Excel.

Pertanyaannya adalah - mengapa tidak menggunakan item bawaan dan memasukkan hasilnya dalam inventaris menggunakan alat Zabbix itu sendiri? Ada tiga jawaban:

  1. Tindakan bersarang tidak memadai, seperti seringkali perlu untuk menarik nilai keluar dari SNMP dan menggunakan hasilnya dalam kueri berikutnya.
  2. Menjalankan pengumpulan data sekali sehari pada semua node dengan skrip eksternal tidak memuat aktivitas pemantauan utama dan tidak ada antrian untuk item'am
  3. Ada data yang tidak dapat dikumpulkan melalui SNMP

Data penyedia, yang tidak bisa dilakukan oleh insinyur garis 1 dan 2, disimpan dalam file excel pada drive jaringan bersama dan diperbarui oleh manajer yang melakukan kontrak komunikasi. Integrasi dengan file menyebabkan keraguan besar - excel parsing, diisi secara manual, yang dapat mengubah struktur, nama, lokasi, dll., Kemungkinan besar akan terus-menerus melakukan kesalahan. Tetapi karena kurangnya sumber lain yang relevan dari data tersebut, saya harus menggunakannya. Untuk melindungi diri dari penyuntingan naskah yang konstan, kami sepakat dengan manajer tentang struktur dan pengisian yang benar, menjelaskan bagaimana pembongkaran otomatis akan dilakukan dan penting untuk mengamati struktur saat ini. Dalam praktiknya, tentu saja, kesalahan terjadi, tetapi kami dengan cepat melacaknya, mengutuk, tetapi memperbaikinya.

inventory.py
 #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys, json, pysnmp, ipaddress, xlrd from datetime import datetime as dt from pysnmp.entity.rfc3413.oneliner import cmdgen def snmp(host, operation, *oid): generator = cmdgen.CommandGenerator() auth_data = cmdgen.UsmUserData('user', 'pwd', 'hash') transport = cmdgen.UdpTransportTarget((host, 161)) getAtt = getattr(generator, '%sCmd'%operation) rst = (errorIndication, errorStatus, errorIndex, varBinds) = getAtt(auth_data, transport, *oid) if not errorIndication is None or errorStatus is True: return "Error: %s %s %s %s" % rst else: if operation=='get': return varBinds elif operation=='next': result=[] for var in varBinds: result.append(var) return result def xlsdata(file, sap): rb = xlrd.open_workbook(file) sheet = rb.sheet_by_index(0) base = {} for i in range(0, sheet.nrows-1): sapnum = str(round(sheet.cell(i,4).value)) if isinstance(sheet.cell(i,4).value,float) else sheet.cell(i,4).value name = str(round(sheet.cell(i,8).value)) if isinstance(sheet.cell(i,8).value,float) else sheet.cell(i,8).value if sap.upper() == sapnum.upper(): base = { 'type' : (sheet.cell(i,2).value), 'serialno_a' : (sheet.cell(i,13).value), 'serialno_b' : (sheet.cell(i,20).value), 'tag' : ('2') if sheet.cell(i, 20).value != '' else ('1'), 'macaddress_a' : (sheet.cell(i, 15).value), 'macaddress_b' : (sheet.cell(i, 22).value) } base['date_hw_purchase'] = dt.date(dt.now()).strftime("%d %B %Y") return (base) def inventory(host, sap): BGPASBASE={} for line in open('/path/a.prokhorov/integration/BGP-AS-BASE.cfg'): if ':' in line: line = line.split(':') BGPASBASE[line[0]]='%s(%s)'%(line[1].rstrip(), line[0]) ### Get Data from Operator shop = xlsdata('/mnt/oprf/providers_base.xlsx', sap) shop['date_hw_expiry'] = 'Failed' ### Get SNMP data shop['host_router'] = 'None' shop['host_netmask'] = 'None' shop['host_networks'] = 'None' try: ### Get Networks from router networks = '' for ip,mask in snmp(host, 'next', 'iso.3.6.1.2.1.4.20.1.1', 'iso.3.6.1.2.1.4.20.1.3'): networks = networks+str(ipaddress.ip_interface(u'%s/%s'%(ip[1].prettyPrint(), mask[1].prettyPrint())))+'\n' shop['host_networks']=networks ### Get BGP information bgppeers, ispnames = '','' for peer,asbgp in snmp(host, 'next', 'iso.3.6.1.2.1.15.3.1.7', 'iso.3.6.1.2.1.15.3.1.9'): asbgp = asbgp[1].prettyPrint() bgppeers = bgppeers+peer[1].prettyPrint()+'\n' ispnames = ispnames+(BGPASBASE.get(asbgp) if BGPASBASE.get(asbgp)!=None else asbgp)+'\n' shop['host_router'] = bgppeers.strip()[:38] shop['host_netmask'] = ispnames.strip()[:38] ### Get Vendor name and Model type hardware = snmp(host, 'get', 'iso.3.6.1.2.1.47.1.1.1.1.13.1', 'iso.3.6.1.2.1.47.1.1.1.1.10.1', 'iso.3.6.1.2.1.47.1.1.1.1.12.1', 'iso.3.6.1.2.1.1.1.0', 'iso.3.6.1.2.1.47.1.1.1.1.7.1') if str(hardware[0][1]) == '0235A325': shop['model'] = hardware[4][1].prettyPrint() else: shop['model'] = hardware[0][1].prettyPrint() shop['os_short'] = hardware[1][1].prettyPrint() shop['vendor'] = hardware[2][1].prettyPrint() version = hardware[3][1].prettyPrint() os = version.split('\n')[0] shop['os_full'] = version[:250] shop['os'] = ''.join(os.split(',')[:2])[:60] ### Make indicators shop['date_hw_expiry'] = 'Success' shop['date_hw_install'] = dt.date(dt.now()).strftime("%d %B %Y") except: shop.pop('host_router') shop.pop('host_netmask') shop.pop('host_networks') return shop #return json.dumps(dict([('inventory',shop)]), sort_keys=True, indent=4) if __name__ == "__main__": print(inventory(sys.argv[1], sys.argv[2])) 

BGP-AS-BASE.cfg
3216:Beeline
9002:Retn
2854:Orange
~omit~
8359:MTS


File BGP-AS-BASE.cfg mewakili korespondensi dari nomor AS dan nama penyedia. Penting untuk menentukan penyedia dengan mana BGP diinstal (tiba-tiba ada kesalahan dalam file dengan kontrak). Basis eksternal tidak digunakan, seperti Ada banyak nomor AS pribadi.

Dalam hal SNMP :

  • kami meminta dari subnet router oleh OID 1.3.6.1.2.1.4.20.1.1 dan subnet mask oleh OID 1.3.6.1.2.1.4.20.1.3 dalam satu permintaan. Kami memprosesnya, menerjemahkannya ke xxxx / xx dan menulisnya di sel host_networks .
  • kami meminta data pada alamat ip dari rekan BGP , serta ASN mereka, kami menemukan nama penyedia dengan nomor dalam database yang kami buat. Kami menulisnya di bidang host_router dan host_netmask . Penting untuk segera membatasi 38 karakter, karena bidang ini tidak mendukung lebih banyak. Nama bidang kami dalam database tidak selalu bertepatan dengan data yang mereka simpan, karena menggunakan bidang yang ada di database Zabbix, agar tidak mengacaukan dengan membuat bidang baru di tabel. Nama bidang yang benar dikoreksi dalam WEB, tidak ada kebingungan.
  • kami mengunggah data pada vendor, model, dan peralatan perangkat lunak. Parsim, tulis ke variabel. Desain yang terkait dengan penulisan model perangkat keras disebabkan oleh fakta bahwa untuk beberapa model, Cisco memiliki nama yang ditulis dalam OID yang berbeda (paling sering untuk sasis), jadi saya harus melakukan pemeriksaan data tambahan.

Seluruh blok yang terkait dengan SNMP terlampir dalam try-kecuali , sehingga jika tidak ada SNMP pada peralatan, skrip tidak jatuh, dan kami setidaknya mendapatkan data dari Excel oleh penyedia. Untuk memahami bagian skrip mana yang telah selesai dan yang tidak, kami menuliskan keberhasilan blok SNMP di bidang date_hw_expiry , ditambah menuliskan tanggal ketika terakhir kali kami bisa menghapus semua data SNMP, dan tanggal kapan terakhir kali kami bisa menemukan data dalam file Excel.


Semua ini kembali dalam bentuk JSON yang siap untuk Zabbix.

Memperbarui semua data inventaris dimulai sekali sehari, membongkar semua host dan memulai inventory.py untuk setiap objek.

mp-update.py
 #!/usr/bin/python3 # -*- coding: utf-8 -*- from multiprocessing import Pool import time from zabbix.api import ZabbixAPI from inventory import inventory from report import report def updating(shop): try: shop['inventory'] = inventory(shop['interfaces'][0]['ip'], shop['host'][-4:]) shop.pop('interfaces') shop['inventory_mode'] = '1' shop.pop('host') print (shop['hostid']) return zapi.host.update(shop) except: print(">>>",shop['hostid']) with open ('/home/local/integration/error.txt', 'a') as err: err.write(shop['hostid']) err.write("\n") if __name__ =='__main__': t = time.time() zapi = ZabbixAPI(url='http://z.noc.x5.ru/', user='user', password='pwd') shopbase = zapi.host.get(output=['host', 'hostid'], groupids= ['12', '13', '14'], monitored="1", selectInterfaces=['ip']) pool = Pool(processes=10) p=[0 for x in range(0,len(shopbase))] for i in range(0, len(shopbase), 10): print ("Index:", i,"\n",shopbase[i],"\n") pool.map(updating,shopbase[i:i+10]) pool.close() pool.join() print(time.time()-t) report('    Zabbix.', 'Inventory updating succeed') 


Multiprocessing digunakan (contoh diambil dari bentangan luas Internet). Untuk mencari, kami menggunakan SAP ID , yang kami miliki dengan nama host. Output yang dihasilkan adalah pembaruan tertulis 'ohm di Zabbix.

Ringkasan


Untuk implementasi semua integrasi, pembaruan otomatis dan pembaruan mekanisme bawaan, Zabbix API lebih dari cukup. Fungsi utama yang digunakan adalah host.get , host.create dan host.update , yang bersama-sama memungkinkan Anda untuk sepenuhnya mengontrol pembuatan dan pemutakhiran database objek pemantauan. Data input dari fungsi-fungsi ini dapat dikirimkan dari sistem dan sumber apa pun yang tersedia.

Modul python utama yang membantu kami mengatasi tugas ini: pysnmp , xlrd , zabbix.api , xml , ipaddress , json .
xlrd - parsing excel.
xml - parsing XML.
pysnmp - menarik data SNMP dari peralatan.

Interaksi SNMP lebih mudah daripada SSH, setidaknya karena dalam praktiknya perangkat keras merespons SNMP lebih cepat daripada SSH, parsing respons SNMP praktis tidak diperlukan, meskipun CLI vendor yang berbeda sering sangat bervariasi, dan kesimpulannya sama. tim dapat berbeda bahkan dalam model yang berbeda dari vendor yang sama.

OID utama yang diterapkan:
iso.3.6.1.2.1.4.20.1.1 - alamat semua antarmuka router
iso.3.6.1.2.1.4.20.1.3 - subnet mask dari semua antarmuka router
iso.3.6.1.2.1.15.3.1.7 - semua rekan BGP dari router
iso.3.6.1.2.1.15.3.1.9 - SEBAGAI semua rekan BGP dari router
iso.3.6.1.2.1.47.1.1.1.1.1.1.1.1 - model
iso.3.6.1.2.1.47.1.1.1.1.10.1 - versi singkat dari perangkat lunak
iso.3.6.1.2.1.47.1.1.1.1.1.12.1 - vendor
iso.3.6.1.2.1.1.1.0 - versi perangkat lunak terperinci
iso.3.6.1.2.1.47.1.1.1.1.7.1 - model, tipe sasis

Dashboard harus ditambahkan sedikit untuk membagi masalah pada jaringan distribusi dan tidak mengganggu mereka dalam tumpukan. Juga tambahkan beberapa bidang, misalnya ip, nama dan alamat penyedia, sehingga jika terjadi kecelakaan massal cukup untuk menyalin-tempel dari peramban ke dalam pesan semua objek dengan masalah, segera dengan semua data yang diperlukan untuk penyedia.


"Workview" ditulis secara terpisah , di mana kami dapat menemukan semua informasi yang dikumpulkan, ditambah grafik yang dikumpulkan untuk objek ini.

Source: https://habr.com/ru/post/id438754/


All Articles