Je souhaitais suivre l’état de mon parc réseau avec l’outil OpenSource ZABBIX.
Mon coeur de réseau est constitué de switches manageables HP Procurve 1800. Chacun des 24ports de ce Switch sont interrogeables au travers du protocole SNMP.
Avec ZABBIX, je peux enregistrer le trafic réseau entrant/sortant pour chaque connexion et créer des graphiques montrant l’évolution de ces valeurs sur une année.
A la main, il faut compter une journée de configuration par Switch.
Fort heureusement, les versions récentes de ZABBIX (1.4 dans ce document) ajoutent la possibilité d’utiliser des « Template » ou « modèle ». Chaque modèle, une fois importé dans ZABBIX, peut-être utilisé autant de fois que requis. Chaque switch se verra doté d’un graphe par ports. Ce graphe détaillera l’évolution du débit entrant/sortant de chacun des ports du Switch.
Il existe un grand nombre de « template » en téléchargement depuis le forum de ZABBIX malheureusement, il n’y a pas de « modèle » pour le HP ProCurve 1800 .
Aussi, je me suis résolu à écrire un générateur de «templates »: “ template_generator.kix”. J’ai fait usage du langage de script KIXTART .
La structure du code est assez modulaire aussi l’adaptation à d’autres matériel ne devrait pas présenter de difficultés. Grace à ce petit script, vous pouvez désormais générer enquelques secondes des modèles pour une grande variété de switches manageables. Les trois premières lignes de code définissent:
- le nom du fichier résultant : $tempFileName
- le nombre de ports: $NbPorts
- l’OID SNMP de base: $BaseOID
Pour le lancer, il suffit de taper la commande:
kix32 template_generator.kix
break on ; name for template file $tempFileName = "MyTemplate.xml" ; number of ports on switch $NbPorts = 24 ; base OID to collect data through SNMP $BaseOID= "1.3.6.1.2.1.2.2.1" ; Build tempalte Write_2_file() exit Function Write_2_file() ; if template already exist, then delete del $TempFileName /h /c ; create new template file to write into IF Open( 3 , $TempFileName , 5 ) = 0 ; header $x = writeline( 3 ,'< ?xml version="1.0"?>'+ @CRLF ) $x = writeline( 3 ,'< zabbix_export version="1.0" date="15.08.09" time="04.24">'+ @CRLF ) ; header to hosts definition $x = writeline( 3 ,'< hosts>'+ @CRLF ) ; header to host definition $x = writeline( 3 ,' < host name="Hp_ProCurve">'+ @CRLF ) $x = writeline( 3 ,' < useip>1< /useip>'+ @CRLF ) $x = writeline( 3 ,' 0.0.0.0'+ @CRLF ) $x = writeline( 3 ,' 10050'+ @CRLF ) $x = writeline( 3 ,' 3'+ @CRLF ) ; declare host as part of the 'template' group $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' Templates'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) ; header to items definition $x = writeline( 3 ,' '+ @CRLF ) ; define item to ping host admin IP $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' Ping to switch'+ @CRLF ) $x = writeline( 3 ,' 30'+ @CRLF ) $x = writeline( 3 ,' 90'+ @CRLF ) $x = writeline( 3 ,' 365'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' public'+ @CRLF ) $x = writeline( 3 ,' interfaces.ifTable.ifEntry.ifInOctets.1'+ @CRLF ) $x = writeline( 3 ,' 161'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) ; add items for admin IP AddItem(1) ; add items for every ports For $Count = 1 To $NbPorts AddItem(100+$Count) Next ; footer to items definition $x = writeline( 3 ,' '+ @CRLF ) ; define trigger on fail to ping host admin IP $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' Fail to ping'+ @CRLF ) $x = writeline( 3 ,' {{HOSTNAME}:icmpping.last(0)}=0'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) ; header to graphs definition $x = writeline( 3 ,' '+ @CRLF ) ; add graphs for admin IP AddGraph(1) ; add items for every ports For $Count = 1 To $NbPorts AddGraph(100+$Count) Next ; footer to items definition $x = writeline( 3 ,' '+ @CRLF ) ; footer to host definition $x = writeline( 3 ,' '+ @CRLF ) ; footer to hosts definition $x = writeline( 3 ,''+ @CRLF ) ; footer $x = writeline( 3 ,""+ @CRLF ) IF Close(3) Beep ? "Error closing file!" ENDIF Else BEEP ? "Failed to Open "+ $TempFileName+": [" + @ERROR + "]" ENDIF EndFunction ; define item to measure input speed on port Function ifInOctets($PortID) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' ifInOctets.'+$PortID+''+ @CRLF ) $x = writeline( 3 ,' 30'+ @CRLF ) $x = writeline( 3 ,' 90'+ @CRLF ) $x = writeline( 3 ,' 365'+ @CRLF ) $x = writeline( 3 ,' bps'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' 8.0'+ @CRLF ) $x = writeline( 3 ,' public'+ @CRLF ) $x = writeline( 3 ,' '+$BaseOID+'.10.'+$PortID+''+ @CRLF ) $x = writeline( 3 ,' 161'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) EndFunction ; define item to measure output speed on port Function ifOutOctets($PortID) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' ifOutOctets.'+$PortID+''+ @CRLF ) $x = writeline( 3 ,' 30'+ @CRLF ) $x = writeline( 3 ,' 90'+ @CRLF ) $x = writeline( 3 ,' 365'+ @CRLF ) $x = writeline( 3 ,' bps'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' 8.0'+ @CRLF ) $x = writeline( 3 ,' public'+ @CRLF ) $x = writeline( 3 ,' '+$BaseOID+'.16.'+$PortID+''+ @CRLF ) $x = writeline( 3 ,' 161'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) EndFunction ; define item to measure link speed on port Function ifSpeed($PortID) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' ifSpeed.'+$PortID+''+ @CRLF ) $x = writeline( 3 ,' 30'+ @CRLF ) $x = writeline( 3 ,' 90'+ @CRLF ) $x = writeline( 3 ,' 365'+ @CRLF ) $x = writeline( 3 ,' bps'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' public'+ @CRLF ) $x = writeline( 3 ,' '+$BaseOID+'.5.'+$PortID+''+ @CRLF ) $x = writeline( 3 ,' 161'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) EndFunction ; define items on port Function AddItem($PortID) ; get input speed ifInOctets($PortID) ; get output speed ifOutOctets($PortID) ; get line speed ifSpeed($PortID) EndFunction ; define graphs for port Function AddGraph($PortID) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' 0.0000'+ @CRLF ) $x = writeline( 3 ,' 100.0000'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' 00FF00'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' 2'+ @CRLF ) $x = writeline( 3 ,' 5'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' 00FF00'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' 2'+ @CRLF ) $x = writeline( 3 ,' 5'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' 0000FF'+ @CRLF ) $x = writeline( 3 ,' 1'+ @CRLF ) $x = writeline( 3 ,' 2'+ @CRLF ) $x = writeline( 3 ,' 5'+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) $x = writeline( 3 ,' '+ @CRLF ) EndFunction