{"id":8,"date":"2025-12-21T20:30:00","date_gmt":"2025-12-21T19:30:00","guid":{"rendered":"https:\/\/airex.se\/blogg\/netbox-zabbix-ordning-och-reda\/"},"modified":"2026-08-02T15:44:08","modified_gmt":"2026-08-02T13:44:08","slug":"netbox-zabbix-ordning-och-reda","status":"publish","type":"post","link":"https:\/\/airex.se\/blogg\/netbox-zabbix-ordning-och-reda\/","title":{"rendered":"Ordning och reda i \u00f6vervakningen: NetBox som facit, Zabbix som v\u00e4ktare"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Jag hade \u00f6vervakning. Jag hade en inventarief\u00f6rteckning. Problemet var att de inte visste om varandra, och att bara den ena av dem hade r\u00e4tt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En sak att veta innan vi g\u00e5r vidare: jag konfigurerar knappt n\u00e5gonting f\u00f6r hand l\u00e4ngre. Arbetet i den h\u00e4r texten utf\u00f6rdes av AI-agenter med mig som best\u00e4llare \u2014 jag beskriver vad som ska g\u00e4lla, granskar vad som faktiskt h\u00e4nde och fattar besluten. Det \u00e4r inte en parentes i ber\u00e4ttelsen. Det \u00e4r det som g\u00f6r att f\u00e4llan l\u00e4ngre ner blir farlig.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Utg\u00e5ngsl\u00e4get: gr\u00e5tt och r\u00f6tt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6vervakning v\u00e4xer s\u00e4llan fram enligt en plan. En server l\u00e4ggs till n\u00e4r den s\u00e4tts i drift, en annan i all hast under en incident, och en tredje gl\u00f6ms bort helt. Efter ett par \u00e5r ser \u00f6versikten ut ungef\u00e4r s\u00e5 h\u00e4r: h\u00e4lften av maskinerna \u00e4r gr\u00f6na, resten \u00e4r gr\u00e5 eller r\u00f6da, och ingen minns om det betyder att de \u00e4r trasiga eller bara felkonfigurerade.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Orsakerna visade sig vara pinsamt banala. En del hostar saknade agent-interface helt. Andra hade interface men ingen mall kopplad, allts\u00e5 inga m\u00e4tv\u00e4rden att samla in. Namns\u00e4ttningen var tre olika konventioner i lager p\u00e5 varandra, beroende p\u00e5 vilket \u00e5r hosten lades in.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">F\u00f6rst: en kv\u00e4ll av snabba fixar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det gick att r\u00e4tta till. Jag bad om det, och en agent gjorde jobbet \u2014 skapade interfaces, kopplade mallar, arbetade sig igenom listan via API:et. Det tog minuter, inte en kv\u00e4ll. Allt lyste gr\u00f6nt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dagen efter var flera hostar gr\u00e5 igen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">H\u00e4r ligger n\u00e5got v\u00e4rt att stanna vid. En agent som f\u00e5r i uppgift att g\u00f6ra en host gr\u00f6n v\u00e4ljer den kortaste v\u00e4gen dit, och den kortaste v\u00e4gen \u00e4r n\u00e4stan alltid att \u00e4ndra direkt i systemet som visar f\u00e4rgen. Den g\u00f6r det snabbt, korrekt och i fel \u00e4nde. En m\u00e4nniska som klickar sig igenom samma sak hinner \u00e5tminstone bli less och undra om det finns ett b\u00e4ttre s\u00e4tt. Agenten blir aldrig less.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Beslutet: en enda k\u00e4lla till sanning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Slutsatsen var inte att sluta anv\u00e4nda agenter. Den var att sluta lita p\u00e5 att den som utf\u00f6r arbetet \u2014 m\u00e4nniska eller modell \u2014 ska v\u00e4lja r\u00e4tt st\u00e4lle att g\u00f6ra det p\u00e5. Det m\u00e5ste avg\u00f6ras av hur systemet \u00e4r byggt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rollf\u00f6rdelningen blev:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>NetBox \u00e4r facit.<\/strong> H\u00e4r st\u00e5r vad som finns, vad det heter, vilken adress det har och vad det \u00e4r f\u00f6r sorts sak.<\/li>\n<li><strong>Zabbix \u00e4r v\u00e4ktaren.<\/strong> H\u00e4r m\u00e4ts och larmas det \u2014 men Zabbix best\u00e4mmer inte sj\u00e4lv vad som ska \u00f6vervakas.<\/li>\n<li><strong>Synken g\u00e5r \u00e5t ett h\u00e5ll.<\/strong> NetBox till Zabbix. Aldrig tillbaka.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Kopplingen sk\u00f6ts av <code>nbxsync<\/code>, ett NetBox-plugin som skapar och uppdaterar hostar i Zabbix utifr\u00e5n inneh\u00e5llet i NetBox. Ett bakgrundsjobb k\u00f6r synken var sextionde sekund.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">F\u00e4llan: enkelriktat betyder verkligen enkelriktat<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Om synken \u00e4r auktoritativ \u00e5t ena h\u00e5llet \u00e4r allt som inte finns i facit per definition <em>fel<\/em> \u2014 och blir bortst\u00e4dat. De handgjorda mall-tilldelningarna och interfacen fanns bara i Zabbix. N\u00e4sta synkcykel s\u00e5g hostar vars konfiguration avvek fr\u00e5n facit och r\u00e4ttade dem. Var sextionde sekund, t\u00e5lmodigt, tills vi f\u00f6rstod vad som p\u00e5gick.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00f6sningen \u00e4r inte att st\u00e4nga av synken. Den \u00e4r att modellera mall-tilldelningar och host-interfaces <em>i NetBox<\/em> \u2014 som egna objekt kopplade till respektive maskin \u2014 och sedan l\u00e5ta synken g\u00f6ra jobbet. Ett interface pekar dessutom p\u00e5 en riktig IP-adress i NetBox IPAM, inte p\u00e5 en textstr\u00e4ng.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det k\u00e4ndes omst\u00e4ndligt i stunden. Det \u00e4r ocks\u00e5 hela po\u00e4ngen: efter\u00e5t g\u00e5r det inte l\u00e4ngre att l\u00e4gga till en maskin i \u00f6vervakningen utan att den f\u00f6rst existerar i inventariet. Genv\u00e4gen \u00e4r st\u00e4ngd \u2014 inte bevakad, st\u00e4ngd.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tre mindre f\u00e4llor p\u00e5 v\u00e4gen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>&#8221;Invalid parameter \/1\/groups: cannot be empty&#8221;<\/strong> \u2014 synken v\u00e4grade skapa hostar. Felet kom fr\u00e5n Zabbix API men orsaken l\u00e5g i NetBox: host-grupperna hade namn i gr\u00e4nssnittet men ett tomt v\u00e4rdef\u00e4lt under ytan. Pluginet renderar det f\u00e4ltet som en mall, tom str\u00e4ng in ger tom str\u00e4ng ut, och Zabbix avvisar hela anropet. Fyll i v\u00e4rdef\u00e4ltet p\u00e5 varje hostgrupp.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>host.update<\/code> ers\u00e4tter, den l\u00e4gger inte till.<\/strong> Skickar man in en mall med <code>host.update<\/code> f\u00f6rsvinner de mallar som redan satt p\u00e5 hosten. Vill man komplettera \u00e4r <code>host.massadd<\/code> r\u00e4tt anrop. Den h\u00e4r kostade en runda av &#8221;men den d\u00e4r lade vi ju precis p\u00e5&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Autentiseringen mot API:et bytte form i Zabbix 7.<\/strong> Token ska numera skickas som <code>Authorization: Bearer<\/code>-header, inte som ett <code>auth<\/code>-f\u00e4lt i anropskroppen. \u00c4ldre exempel p\u00e5 n\u00e4tet g\u00f6r det senare, och felmeddelandet man f\u00e5r \u00e4r inte till n\u00e5gon hj\u00e4lp. L\u00e4gg till att en API-token kan sluta g\u00e4lla utan att n\u00e5got skriker om det \u2014 synken bara tystnar, och en tyst synk ser precis ut som en synk utan arbete att g\u00f6ra.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vad som \u00e4ndras n\u00e4r agenter g\u00f6r jobbet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Jag har inte skrivit den h\u00e4r milj\u00f6ns konfiguration f\u00f6r hand p\u00e5 l\u00e4nge. Jag beskriver vad som ska g\u00e4lla, agenter utf\u00f6r, och jag granskar resultatet. Det fungerar f\u00f6rv\u00e5nansv\u00e4rt bra \u2014 och det f\u00f6r\u00e4ndrar vilka fel man beh\u00f6ver skydda sig mot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hastighet f\u00f6rstorar avdrift.<\/strong> Den som \u00e4ndrar tjugo saker i minuten hinner skapa mer oordning innan lunch \u00e4n vad en m\u00e4nniska g\u00f6r p\u00e5 en vecka. Ett facit \u00e4r inte mindre viktigt n\u00e4r arbetet automatiseras \u2014 det \u00e4r f\u00f6ruts\u00e4ttningen f\u00f6r att automatiseringen ska vara ofarlig.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Disciplin fungerar inte som skydd.<\/strong> Man kan komma \u00f6verens med sig sj\u00e4lv om att alltid g\u00e5 via inventariet. Man kan inte komma \u00f6verens om det med en modell som f\u00e5r uppgiften &#8221;se till att den h\u00e4r hosten \u00f6vervakas&#8221; n\u00e4sta g\u00e5ng, i en annan session, utan minnet av den h\u00e4r kv\u00e4llen. Det som h\u00e5ller \u00e4r att den felaktiga v\u00e4gen inte leder till ett best\u00e5ende resultat \u2014 och det \u00e4r precis vad en enkelriktad synk g\u00f6r.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Gr\u00f6nt \u00e4r inte ett bevis.<\/strong> En agent som f\u00e5r i uppdrag att g\u00f6ra n\u00e5got gr\u00f6nt kommer att lyckas g\u00f6ra det gr\u00f6nt. Fr\u00e5gan \u00e4r om f\u00e4rgen betyder att det fungerar eller bara att n\u00e5gon precis r\u00f6rt vid det. D\u00e4rf\u00f6r m\u00e5ste verifieringen vara mekanisk och tidsf\u00f6rdr\u00f6jd \u2014 se n\u00e4sta avsnitt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resten av ordningen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tv\u00e5 saker till gjordes samtidigt, och de h\u00f6r ihop med samma tanke.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alla hostnamn standardiserades till ett enda format med tillh\u00f6rande DNS-poster. Det l\u00e5ter kosmetiskt. Det \u00e4r det inte: n\u00e4r namnet i inventariet, namnet i \u00f6vervakningen och namnet i DNS \u00e4r samma str\u00e4ng kan de matchas maskinellt, och d\u00e5 blir fr\u00e5gan &#8221;\u00e4r allt \u00f6vervakat?&#8221; m\u00f6jlig att svara p\u00e5 med en j\u00e4mf\u00f6relse i st\u00e4llet f\u00f6r med en k\u00e4nsla.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Och agenterna \u2014 den h\u00e4r g\u00e5ngen i betydelsen \u00f6vervakningsagenter \u2014 rullades ut med Ansible p\u00e5 b\u00e5de Linux- och Windows-sidan. Samma princip en g\u00e5ng till: det som utf\u00f6rs ad hoc kommer att se olika ut p\u00e5 olika maskiner, och skillnaderna uppt\u00e4cks alltid vid s\u00e4msta t\u00e4nkbara tillf\u00e4lle.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">S\u00e5 vet du att det funkar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det r\u00e4cker inte att titta p\u00e5 en gr\u00f6n ikon direkt efter en \u00e4ndring. Testet \u00e4r att g\u00f6ra \u00e4ndringen och sedan <em>v\u00e4nta ut minst en synkcykel<\/em> \u2014 i det h\u00e4r fallet en dryg minut \u2014 och titta igen. St\u00e5r konfigurationen kvar har den sitt ursprung i facit. Har den f\u00f6rsvunnit gjordes den i fel \u00e4nde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ett andra test: l\u00e4gg in en ny maskin i inventariet med r\u00e4tt grupp, mall och interface, och r\u00f6r inte \u00f6vervakningen alls. Dyker den upp av sig sj\u00e4lv och b\u00f6rjar samla in data, d\u00e5 fungerar kedjan. M\u00e5ste n\u00e5gon hj\u00e4lpa till p\u00e5 slutet \u00e4r n\u00e5got fortfarande manuellt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Titta ocks\u00e5 i synkjobbets logg, inte bara i webbgr\u00e4nssnittet. D\u00e4r syns skillnaden mellan &#8221;synken k\u00f6rde och hade inget att g\u00f6ra&#8221; och &#8221;synken k\u00f6rde aldrig&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vad jag tar med mig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6vervakning som konfigureras ad hoc glider is\u00e4r. Det tar ett par \u00e5r med m\u00e4nniskor vid tangentbordet och betydligt kortare tid med agenter, men det h\u00e4nder alltid, och man m\u00e4rker det f\u00f6rst n\u00e4r n\u00e5got g\u00e5r s\u00f6nder p\u00e5 en maskin som ingen kom ih\u00e5g att l\u00e4gga in.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Den obekv\u00e4ma delen av att inf\u00f6ra ett facit \u00e4r inte tekniken. Det \u00e4r att sluta l\u00f6sa saker d\u00e4r det g\u00e5r snabbast. Varje g\u00e5ng n\u00e5got r\u00e4ttades direkt i \u00f6vervakningen blev det r\u00e4tt i tjugo sekunder och fel en minut senare \u2014 och det var systemet som hade r\u00e4tt, inte vi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vinsten kommer n\u00e4r fr\u00e5gan &#8221;\u00f6vervakas allt vi \u00e4ger?&#8221; g\u00e5r fr\u00e5n att vara en \u00e5sikt till att vara en j\u00e4mf\u00f6relse mellan tv\u00e5 listor. Det \u00e4r hela skillnaden mellan att ha \u00f6vervakning och att kunna lita p\u00e5 den \u2014 och det \u00e4r ocks\u00e5 vad som g\u00f6r att jag v\u00e5gar l\u00e5ta en modell utf\u00f6ra arbetet.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Jag konfigurerar knappt n\u00e5got f\u00f6r hand \u2014 agenter g\u00f6r jobbet. Det g\u00f6r ett facit viktigare, inte mindre viktigt: allt som fixades direkt i \u00f6vervakningen st\u00e4dades bort av synken var sextionde sekund.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-8","post","type-post","status-publish","format-standard","hentry","category-drift"],"_links":{"self":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/comments?post=8"}],"version-history":[{"count":1,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/8\/revisions"}],"predecessor-version":[{"id":9,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/8\/revisions\/9"}],"wp:attachment":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/media?parent=8"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/categories?post=8"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/tags?post=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}