{"id":200,"date":"2018-10-09T18:51:42","date_gmt":"2018-10-09T16:51:42","guid":{"rendered":"https:\/\/blog.scani.fr\/?p=200"},"modified":"2018-10-09T19:43:30","modified_gmt":"2018-10-09T17:43:30","slug":"supervision-du-reseau","status":"publish","type":"post","link":"https:\/\/blog.scani.fr\/index.php\/2018\/10\/09\/supervision-du-reseau\/","title":{"rendered":"Supervision du r\u00e9seau"},"content":{"rendered":"<p>L&rsquo;ensemble de la supervision du r\u00e9seau de SCANI a \u00e9t\u00e9 refondue cet \u00e9t\u00e9. Il faut savoir que ce qui existait avant avait \u00e9t\u00e9 mont\u00e9 bribe par bribe, en fonction de l&rsquo;arriv\u00e9e des besoins, que ce n&rsquo;\u00e9tait pas toujours exhaustif (par exemple, les 4 machines jouant le r\u00f4le de serveurs DNS pour l&rsquo;ensemble des membres n&rsquo;\u00e9taient pas surveill\u00e9es) et, surtout, que c&rsquo;\u00e9tait de plus en plus gourmand en ressources techniques.<!--more--><\/p>\n<p>Cette ancienne supervision fonctionnait sur la m\u00eame machine que le syst\u00e8me d&rsquo;information technique et cartographique de la coop\u00e9rative. Du coup, depuis d\u00e9but 2018, tout \u00e7a \u00e9tait fortement ralenti, puisqu&rsquo;\u00e0 chaque nouvelle antenne install\u00e9e correspondait un nouveau test de supervision mis en place.<\/p>\n<p>Un appel a bonnes id\u00e9es et \u00e0 \u00ab\u00a0propose quelque chose\u00a0\u00bb avait donc \u00e9t\u00e9 lanc\u00e9 et c&rsquo;est Benjamin qui s&rsquo;y est coll\u00e9. Bruno a ensuite mis sa patte pour la mise en production et les d\u00e9veloppements n\u00e9cessaires dans le syst\u00e8me d&rsquo;information.<\/p>\n<p>L&rsquo;ancienne plateforme tournait sur la base d&rsquo;un Nagios agr\u00e9ment\u00e9 du plugin pnp4nagios pour la partie graphiques historiques. Les pr\u00e9requis pour la nouvelle \u00e9taient les suivants :<\/p>\n<ul>\n<li>Scalabilit\u00e9 (la possibilit\u00e9 de monter en puissance sans avoir \u00e0 tout refaire)<\/li>\n<li>D\u00e9l\u00e9gation du travail de supervision \u00e0 plusieurs machines distantes (dans Zabbix, ce sont des proxy)<\/li>\n<li>Possibilit\u00e9, au choix, de g\u00e9n\u00e9rer la configuration de la supervision automatiquement en conservant une partie manuelle, ou bien de discuter avec une API pour modifier la configuration globale existante (dans Zabbix, il y a une API, et on s&rsquo;en est plut\u00f4t bien sorti)<\/li>\n<li>Interface moderne et moteur de g\u00e9n\u00e9ration de graphique personnalisable (l\u00e0 dessus, Zabbix a encore des progr\u00e8s \u00e0 faire)<\/li>\n<\/ul>\n<p>Le choix, pour la nouvelle plateforme, s&rsquo;est port\u00e9 sur Zabbix. Il a une m\u00e9thode de fonctionnement assez contre-intuitive quand on vient du monde de la supervision des ann\u00e9es 1990, mais il faut reconna\u00eetre qu&rsquo;il cochait pas mal de cases de notre liste. Voil\u00e0 en gros comment \u00e7a fonctionne :<\/p>\n<ul>\n<li>Une premi\u00e8re couche est constitu\u00e9e d&rsquo;une liste de sources de donn\u00e9es (items dans Zabbix), chacune raccroch\u00e9e \u00e0 un seul \u00e9quipement. Cette source peut \u00eatre un agent Zabbix propri\u00e9taire (donc on ne s&rsquo;en sert pas sur les antennes), une requ\u00eate SNMP (ce qu&rsquo;on a choisi), et tout un tas d&rsquo;autres agents, jusqu&rsquo;au lancement d&rsquo;un b\u00eate script qu&rsquo;on peut \u00e9crire soi m\u00eame.<\/li>\n<li>On doit, ensuite, r\u00e9aliser des triggers. Ce sont des \u00e9v\u00e8nements qui se d\u00e9clenche lorsqu&rsquo;une ou plusieurs conditions sont remplies. Par exemple \u00ab\u00a0le taux de paquets perdus \u00e0 destination de cette machine est sup\u00e9rieur \u00e0 20% depuis plus de 20 minutes\u00a0\u00bb ou bien \u00ab\u00a0la m\u00e9moire disponible sur telle machine est inf\u00e9rieur \u00e0 5%\u00a0\u00bb, mais aussi des choses beaucoup plus rock&rsquo;n&rsquo;roll, comme \u00ab\u00a0au rythme ou \u00e7a va ces 2 derni\u00e8res heures, tel disque dur sera plein dans moins de 48h\u00a0\u00bb. Bref, infiniment plus de possibilit\u00e9s que le simple \u00ab\u00a0je collecte un chiffre et si il est plus grand ou plus petit que tel autre chiffre, \u00e7a envoi une alerte\u00a0\u00bb.<\/li>\n<li>Et enfin, une derni\u00e8re couche permet d&rsquo;envoyer les alertes \u00e0 X, Y ou Z personnes avec des m\u00e9dias diff\u00e9rents (mail, jabber, script perso, &#8230;)<\/li>\n<\/ul>\n<p>Le tout est agr\u00e9ment\u00e9 de notions de template, ce qui permet de cr\u00e9er par exemple la supervision id\u00e9ale de tel type d&rsquo;\u00e9quipement et ensuite de l&rsquo;appliquer en s\u00e9rie \u00e0 des centaines d&rsquo;\u00e9quipements. Lorsqu&rsquo;on modifie le template, tout le monde suit.<\/p>\n<p>Il y a \u00e9galement un principe de discovery bien utile pour les choses qui peuvent varier d&rsquo;un \u00e9quipement \u00e0 un autre. On s&rsquo;en sert surtout pour la supervision des partitions de disques dur (qui ne sont pas toutes les m\u00eames sur toutes les machines) ou des interfaces r\u00e9seau (dont le nombre varie d&rsquo;une antenne \u00e0 une autre). Une fois bien configur\u00e9, tout \u00e7a est transparent dans l&rsquo;usage quotidien de l&rsquo;outil, \u00e7a change des fichiers de configurations qui font 12000 kilom\u00e8tres de long.<\/p>\n<p>Du coup, mise en pratique !<\/p>\n<p>Premier objectif : parvenir \u00e0 extraire des antennes du r\u00e9seau au moins autant d&rsquo;information que ce qu&rsquo;on avait avant. Une inf\u00e2me mixture de requ\u00eates SNMP et de lancement de scripts SSH et HTTPS \u00e9tait n\u00e9cessaire jusqu&rsquo;\u00e0 pr\u00e9sent, mais on a trouv\u00e9 toutes les OID n\u00e9cessaires pour extraire ce dont on avait besoin en SNMP. Un socle commun de templates a \u00e9t\u00e9 mont\u00e9 \u00e0 partir de ce qu&rsquo;on a trouv\u00e9 en ligne, et trois d\u00e9riv\u00e9s, pour les antennes Ubiquiti g\u00e9n\u00e9ration M, AC et AirFiber ont ensuite \u00e9t\u00e9 mont\u00e9s par dessus.<\/p>\n<p>Pour la faire courte, on r\u00e9cup\u00e8re donc :<\/p>\n<ul>\n<li>Les infos ICMP (RTT et Loss)<\/li>\n<li>La disponibilit\u00e9 SNMP et SSH<\/li>\n<li>Les infos radios (capacit\u00e9 RX, capacit\u00e9 TX, CCQ quand applicable, puissance d&rsquo;\u00e9mission, SSID, largeur de canal, force de signal re\u00e7ue, noisefloor, RSSI, fr\u00e9quence, distance du lien radio)<\/li>\n<li>Les infos syst\u00e8me (hostname, location snmp, m\u00e9moire, disque, firmware, baseboard, uptime)<\/li>\n<li>Les infos r\u00e9seau (d\u00e9bit, paquets, loss, discard, vitesse et nom de chaque interface)<\/li>\n<li>Une information \u00ab\u00a0virtuelle\u00a0\u00bb qui suit la formule suivante : (rx + tx) * RSSI \/ signal * -1 \/ (loss + 1) et qui permet d&rsquo;obtenir une vue assez fid\u00e8le de la qualit\u00e9 de chaque liaison radio<\/li>\n<\/ul>\n<p>De tout \u00e7a, on sort un certain nombre de triggers :<\/p>\n<ul>\n<li>Changement de param\u00e8tre (fr\u00e9quence, largeur de canal, firmware, reboot, baseboard)<\/li>\n<li>Injoignabilit\u00e9 (plus de 10 minutes sans r\u00e9ponse au ping)<\/li>\n<li>Lien de faible qualit\u00e9 (signal &lt; -80)<\/li>\n<li>Capacit\u00e9 RX ou TX qui rebondi \u00e0 6.5 (g\u00e9n\u00e9ralement signe que la fr\u00e9quence utilis\u00e9e est perturb\u00e9e)<\/li>\n<li>Perte de paquets trop importante<\/li>\n<\/ul>\n<p>Toutes les notifications issues de ces triggers sont ensuite envoy\u00e9s \u00e0 un script local \u00e0 la machine de supervision qui va questionner le syst\u00e8me d&rsquo;information pour savoir ce qu&rsquo;il convient de faire avec l&rsquo;alerte. Le SI dispose de plusieurs groupes de notification Telegram, secteur g\u00e9ographique par secteur g\u00e9ographique, et indique donc \u00e0 la supervision \u00e0 quel groupe Telegram il faut envoyer le message pour que les personnes concern\u00e9es le re\u00e7oivent. Il peut, bien entendu, envoyer une info \u00e0 plusieurs groupes en m\u00eame temps.<\/p>\n<p>Dans tous les cas, Zabbix garde l&rsquo;historique des triggers qui se sont d\u00e9clench\u00e9s, m\u00eame si aucune alerte n&rsquo;a \u00e9t\u00e9 \u00e9mise, pour permettre d&rsquo;aller consulter les historiques.<\/p>\n<p>Outre les antennes, on supervise aussi les routeurs et divers switchs du r\u00e9seau ainsi que les quelques machines virtuelles dont on se sert. Il reste un peu de travail \u00e0 faire de ce c\u00f4t\u00e9 pour \u00eatre alert\u00e9s convenablement de certains probl\u00e8mes.<\/p>\n<p>L&#8217;empilement de tout \u00e7a donne 1300 \u00e9quipements supervis\u00e9s pour 106054 sources de donn\u00e9es (mises \u00e0 jour entre une fois par minute et une fois par jour, en fonction des sources) et 30230 triggers susceptibles de se d\u00e9clencher en fonction des donn\u00e9es r\u00e9colt\u00e9es.<\/p>\n<p>La machine virtuelle qui g\u00e8re tout \u00e7a dispose de 150Go d&rsquo;espace disque, de 6Go de ram et de 8 vCPU et r\u00e9colte une moyenne de 320 valeurs par seconde.<\/p>\n<p>En face de Zabbix lui m\u00eame, le syst\u00e8me d&rsquo;information lui envoi ses directives de configuration via l&rsquo;API (telle antenne doit \u00eatre supervis\u00e9e, telle autre a chang\u00e9 de nom, celle-ci a chang\u00e9 de mod\u00e8le et on doit donc lui appliquer d&rsquo;autres types de tests, &#8230;), r\u00e9cup\u00e8re, \u00e0 la demande, divers graphiques qui sont affich\u00e9s sur la cartographie (qualit\u00e9 des liens, d\u00e9bit, &#8230;). On a \u00e9galement un script qui va r\u00e9cup\u00e9rer, toujours via l&rsquo;API, l&rsquo;ensemble des information de qualit\u00e9 de liens pour constituer la carte globale du r\u00e9seau et, bien s\u00fbr, celui qui aiguille les alertes vers les groupes Telegram.<\/p>\n<p>Au chapitre \u00ab\u00a0tout n&rsquo;est pas rose dans Zabbix\u00a0\u00bb :<\/p>\n<ul>\n<li>Contrairement \u00e0 ce qu&rsquo;on avait avant, l&rsquo;historisation de donn\u00e9e est beaucoup moins fine : soit on garde tout ce qui a \u00e9t\u00e9 r\u00e9colt\u00e9 (et on fait exploser la machine), soit on n&rsquo;en garde que quelques jours et Zabbix fait ensuite des moyennes heure par heure (ou \u00e0 une autre granularit\u00e9, mais on n&rsquo;a pas trouv\u00e9 ou \u00e7a se changeait .. Bon, on n&rsquo;a pas beaucoup cherch\u00e9, il faut dire). Dans la plateforme pr\u00e9c\u00e9dente, on utilisait RRDTools, qui permettait par exemple de dire \u00ab\u00a0on garde toute la r\u00e9colte pendant 1 mois, puis on fait une moyenne sur 10 minutes pour 6 mois, puis sur 1 heure pour 1 an, puis sur un jour pour 10 ans\u00a0\u00bb .. Et surtout, ce type de granularit\u00e9 \u00e9tait configurable source par source. La ou 10 ans de donn\u00e9es de nos 1300 \u00e9quipements pouvaient rentrer dans 60Go, il en faudra probablement 20 \u00e0 30 fois plus pour la m\u00eame r\u00e9tention dans Zabbix (mais en m\u00eame temps, on collecte beaucoup plus d&rsquo;infos)<\/li>\n<li>Le moteur de g\u00e9n\u00e9ration de graphiques souffre de grosses carences : impossible d&rsquo;utiliser deux axes verticaux (un \u00e0 gauche pour la latence et un \u00e0 droite pour la perte par exemple) en indiquant des minima et maxima diff\u00e9rents. Hardu, \u00e9galement, de faire un graphique de d\u00e9bit avec l&rsquo;inbound en positif et l&rsquo;outbound en n\u00e9gatif. Impossible d&rsquo;inclure une interface r\u00e9seau pr\u00e9cise sur l&rsquo;\u00e9cran r\u00e9capitulatif d&rsquo;un \u00e9quipement si celle-ci a \u00e9t\u00e9 d\u00e9couverte automatiquement : soit on les met toutes, soit on n&rsquo;en met pas. Bref, y&rsquo;a encore du boulot ! On a contourn\u00e9 une partie des probl\u00e8mes en installant Grafana (qui fera l&rsquo;objet d&rsquo;un article ult\u00e9rieurement) et en int\u00e9grant manuellement certains graphiques issus de Zabbix dans des pages du syst\u00e8me d&rsquo;information (mais du coup, on perd les fonctionnalit\u00e9s de d\u00e9placement dans le temps et de zoom)<\/li>\n<li>La partie optimisation est incontournable et assez peu (ou mal) document\u00e9e. On a pass\u00e9 un bon mois avec un Zabbix qui plantait r\u00e9guli\u00e8rement, on a du renoncer aux triggers qui calculaient des moyennes mensuelles parce que \u00e7a faisait totalement exploser la machine quand ils \u00e9taient calcul\u00e9s et le nettoyage des anciennes valeurs est \u00e0 pr\u00e9sent g\u00e9r\u00e9 par le partitionnement de MySQL plut\u00f4t que par Zabbix lui m\u00eame.<\/li>\n<\/ul>\n<p>En bref, on est plut\u00f4t content, on a gagn\u00e9 en source de donn\u00e9es et en clart\u00e9 de pr\u00e9sentation, mais on regrette fortement RRDTools qui \u00e9tait un outil de stockage et de pr\u00e9sentation de donn\u00e9es tr\u00e8s performant et peu gourmand, \u00e0 la fois en temps processeur et en espace disque.<\/p>\n<p>Un grand merci \u00e0 <a href=\"https:\/\/twitter.com\/stevedestivelle\" target=\"_blank\" rel=\"noopener\">@SteveDESTIVELLE<\/a> qui a fil\u00e9 pas mal de coups de main pendant toute la phase de mise en production !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;ensemble de la supervision du r\u00e9seau de SCANI a \u00e9t\u00e9 refondue cet \u00e9t\u00e9. Il faut savoir que ce qui existait avant avait \u00e9t\u00e9 mont\u00e9 bribe par bribe, en fonction de l&rsquo;arriv\u00e9e des besoins, que ce n&rsquo;\u00e9tait pas toujours exhaustif (par exemple, les 4 machines jouant le r\u00f4le de serveurs DNS pour l&rsquo;ensemble des membres n&rsquo;\u00e9taient [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":201,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,4],"tags":[],"class_list":["post-200","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-reseau","category-technique"],"_links":{"self":[{"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/posts\/200","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/comments?post=200"}],"version-history":[{"count":2,"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/posts\/200\/revisions"}],"predecessor-version":[{"id":204,"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/posts\/200\/revisions\/204"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/media\/201"}],"wp:attachment":[{"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/media?parent=200"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/categories?post=200"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.scani.fr\/index.php\/wp-json\/wp\/v2\/tags?post=200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}