Kuinka yhdistää Zabbix Asteriskin kanssa pakkauksesta

Aiemmassa artikkelissa "Zabbix - makrorajojen laajentaminen" Kerroin, kuinka voit vastaanottaa valtuutusistunnon ja korvata sen paikallisella isäntämakrolla. Tässä artikkelissa kerron sinulle kuinka yhdistää Zabbix Asteriskiin ilman ulkoisia skriptejä ja ohjelmistoja.

Ajatus näiden kahden järjestelmän "ystävystymisestä" syntyi kauan sitten ilman lisäohjelmistojen tai komentosarjojen asentamista. Nopea googlaus tuotti monia mahdollisia ratkaisuja, kaikki kiteytyi siihen, että lataa skriptit (Pyha, Bash, Python jne.) palvelimelle, niin olet onnellinen. Halusin toteuttaa valvonnan "pakkauksesta" - ilman ulkoisia skriptejä ja lisäohjelmistojen asentamista palvelimelle valvonnan ja PBX:n kanssa.

Vietin tämän kanssa yhteensä 4 työpäivää, mutta tulos oli sen arvoinen. AMI-liitännän, matalan tason havaitsemisen, liipaisujen ja mikä tärkeintä, PBX:n ja kaikkien muiden asetusten yhdistäminen vie nyt noin 15 minuuttia.

Zabbix 4.4 on saatavilla, noin 100 kappaletta Asterisk-versiota 13. Joissakin vaihteissa on FreePBX-verkkoliittymä, joissakin paljas konsoli, joukko temppuja ja integrointi soittosuunnitelman kautta.

Tietojen vastaanotto PBX:stä

Ensimmäinen ja tärkein asia, joka on ratkaistava, on tietojen hankkiminen vertaisista ja SIP-rekisteröinneistä. Tätä tarkoitusta varten PBX:ssä on AGI-, AMI-, ARI- ja SSH-konsoliliitännät. Ilmeisistä syistä en ajatellut lisämoduuleja.

Ensin täytyy selvittää, mitä nämä agi, ami, ari ovat...

  • AGI - skriptien käyttö soittosuunnitelmassa. Käytetään pääasiassa puheluiden hallintaan.
  • AMI - voi tarjota kaikki tarvittavat tiedot, toimii portin 5038 kautta, kuten Telnet. Sopii meille!
  • ARI - moderni, muodikas, JSON. Mahdollisuuksia on monia, tietomuoto on Zabbixille ymmärrettävä, mutta minulle ei ole pääasia: et voi hallita sip-rekisteröintiä. Toinen haittapuoli on se, että vertaisilla on vain kaksi tilaa online/offline, vaikka tiloja on enemmän ja ne on hyödyllistä ottaa huomioon diagnosoitaessa.
  • SSH voi tehdä kaiken, mutta joskus se ei ole sallittua "turvallisuussyistä". Pohdinnat voivat olla erilaisia, en mene niihin.

ARI kattaa kuitenkin kaikkine puutteineen 90 % kaikista seurantatarpeista.

Zabbix ja Telnet - pettymykseni

Tunnen AMI:n hyvin; aikoinaan toteutin menetysten seurantaa keskusteluissa etätoimistojen jaon kanssa, puheluiden hallintaa jne. Telnetissä kaikki on myös hyvin selvää: avaa yhteys, lähetä komennot ja lue vastaus. Näin tein, mutta tulos pettyi.

Telnet Zabbixissa ei ole sama kuin Linux-konsolissa, se on hieman yksinkertaisempi ja räätälöity tavalliseen valtuutukseen, kuten sisäänkirjautumiseen/salasanaan. Jos valtuutuslogiikka on erilainen eikä sisäänkirjautumis-/salasana-paria pyydetä, tapahtuu virhe. Sen jälkeen, kun turhia yrityksiä oli ohittaa valtuutusvaatimus, oli hyödyllistä tarkastella Telnet-moduulin lähdekoodia.

Tajusin, että ennen kuin on olemassa perinteinen kirjautumis- ja salasanapyyntö, en siirry eteenpäin. Ihan huvikseni poistin koodista kaiken valtuutukseen liittyvän ja kokosin kaiken uudelleen. Toimii! Mutta se ei täytä vaatimuksia. Mene eteenpäin…

Palataan hakuun

Luin uudelleen ARI-dokumentaation, tein lisätestejä - täällä ei ole sip-rekisteröintiä. On juhlia, on keskusteluja, on polvihousuja, mutta ei ilmoittautumisia. Jossain vaiheessa jopa ajattelin, että tarvitsemmeko todella korppikotkan rekisteröintiä?

Hauskan sattuman seurauksena tällä hetkellä käyttäjältä saapuu toinen pyyntö, jossa on ongelma lähtevien puhelujen kanssa. Ongelmana oli, että sip-rekisteröinti jäätyi ja se ratkesi yksinkertaisesti käynnistämällä moduuli uudelleen.

asterisk -rx "sip reload"

Olisi hienoa päästä AMI:hen verkon kautta: se ratkaisisi kaikki ongelmat, ajattelin. Aloitan kaivamisen tähän suuntaan, ja kirjaimellisesti ensimmäinen hakurivi johtaa viralliseen Asterisk-dokumentaatioon, joka sanoo, että tehtävilleni on vaihtoehto web-kelpoinen tiedostossa /etc/asterisk/manager.conf, jonka arvoksi on asetettava KYLLÄ, osiossa [yleistä]

Tämän jälkeen lomakkeen tavallisen verkkopyynnön kautta http://ats:8089/mxml?action=SIPshowregistry saamme kaikki tarvittavat tiedot.

FreePBX-käyttöliittymää käytettäessä tätä vaihtoehtoa ei voi ottaa käyttöön verkon kautta, vaan se on otettava käyttöön konsolin kautta tekemällä muutoksia manager.conf-tiedostoon. FreePBX ei poista sitä, kun kokoonpanomuutoksia tehdään verkon kautta.

Olen työskennellyt erilaisten Asterisk-integraatioiden kanssa pitkään, mutta en ole koskaan nähnyt tätä ominaisuutta mainittavan missään. Olin yllättynyt siitä, että kukaan ei kuvaile tätä tapaa olla vuorovaikutuksessa PBX:n kanssa. Tästä aiheesta oli jopa erityisen hyödyllistä etsiä tietoa: ei käytännössä mitään tai sitä käytettiin täysin eri tehtäviin.

WEB AMI - millainen peto?

Lisätään vaihtoehto web-kelpoinen arkistoida manager.conf tarjosi täyden pääsyn ATS-hallintaan verkon kautta. Kaikki tavallisen AMI:n kautta saatavilla olevat komennot ovat nyt verkossa, voit kuunnella tapahtumia PBX:stä pistorasian kautta. Toimintaperiaate ei eroa konsolin AMI:stä. Kun olet aktivoinut tämän vaihtoehdon, voit ottaa yhteyttä PBX:ään seuraavissa osoitteissa:

https://ats:8089/manager — Web-sivu, jossa on yksinkertainen käyttöliittymä testausta ja pyyntöjen manuaalista lähettämistä varten. Kaikki vastaukset muotoillaan luettavaan HTML-muotoon. Ei kovin sopiva seurantaan.
https://ats:8089/rawman — vain tekstitulostus, muoto, joka on samanlainen kuin konsolin AMI
https://ats:8089/mxml - Vain tekstitulostus XML-muodossa. Sopii meille!

Kuinka yhdistää Zabbix Asteriskin kanssa pakkauksesta

Sitten ajattelin: "Tämä on ratkaisu! Nyt kaikki on valmista! Helppopisistä sitruunapuristettua”, mutta oli liian aikaista iloita. Saadaksemme tarvitsemamme tiedot, riittää, että käytämme GET-pyyntöä tarvittavin toimin toiminta, joka vastauksena palauttaa xml-tiedoston luettelon kaikista rekisteröinneistä ja niiden tilasta. Tämä kaikki on hienoa, mutta tarvitset luvan muistaaksesi istunnon evästeestä. Kun testaat selaimessa, et ajattele tätä prosessia.

Valtuutusprosessi

Ensin käsitellään osoite http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, vastauksena palvelin lähettää meille evästeen valtuutusistunnon yhteydessä. HTTP-pyyntö näyttää tältä:

https://ats:8089/mxml?action=login&username=zabbix&secret=zabbix

Host: ats:8089
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Vastaus:

GET: HTTP/1.1 200 OK
Server: Asterisk/13.29.2
Date: Thu, 18 Jun 2020 17:41:19 GMT
Cache-Control: no-cache, no-store
Content-type: text/xml
Set-Cookie: mansession_id="6f5de42c"; Version=1; Max-Age=600
Pragma: SuppressEvents
Content-Length: 146

<ajax-response>
<response type="object" id="unknown">
<generic response="Success" message="Authentication accepted"/>
</response>
</ajax-response>

Siellä töihin tarvitset talon_tunnus="6f5de42c", eli itse valtuutuseväste.
Sisältö, jonka tarvitset vain tarkistaaksesi vastauksen "Todennus hyväksytty" Seuraavaksi meidän on lisättävä pyyntöön valtuutuseväste kaikille PBX-palvelimelle soitetuille puheluille.

https://ats:8089/mxml?action=SIPpeers

Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"

Lue valtuutusevästeen hankkimisesta ja sen käyttämisestä muissa pyynnöissä täältä: "Zabbix - makrorajojen laajentaminen»

Seurantaelementtien luomiseen Zabbixissa käytän automaattista tunnistusta.

Automaattinen tunnistus

Voit automaattisesti tunnistaa rekisteröinnit ja seurata vertaistiloja ottamalla yhteyttä seuraavaan osoitteeseen: https://ats:8089/mxml?action=SIPshowregistry tai https://ats:8089/mxml?action=SIPpeers

Vastauksena PBX palauttaa meille XML-vastauksen:

<ajax-response>
<response type="object" id="unknown">
<generic response="Success" eventlist="start" message="Registrations will follow"/>
</response>
...
<response type="object" id="unknown">
<generic event="RegistryEntry" host="login.mtt.ru" port="5060" username="111111" domain="login.mtt.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="222222" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="333333" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
...
</ajax-response>

Vastauksessa on paljon roskaa, joten esikäsittelyssä suodatamme sen mallin mukaan XPath: //response/generic[@host]
Sitten alkaa hauskuus. Jotta voit työskennellä tunnistuksen kanssa ja luoda elementtejä dynaamisesti, vastauksen on oltava JSON-muodossa. XML:ää ei tueta automaattisessa tunnistuksessa.

Muuntaakseni XML:n JSON-muotoon minun piti pelata hieman automaattisella korvauksella, jota varten tein skriptin JS:ssä

Kuinka yhdistää Zabbix Asteriskin kanssa pakkauksesta

Mielenkiintoinen kohta: ATS-vastauksessa kaikki parametrit on ympäröity yksittäisillä lainausmerkeillä ja mallin soveltamisen jälkeen //response/generic[@host] ne korvataan kaksinkertaisilla.

Elementtien luomiseen käytämme muuttujia XML-vastauksesta (nyt JSON).

Kuinka yhdistää Zabbix Asteriskin kanssa pakkauksesta

SIP-rekisteri

Sip-rekisteröinnissä käytämme kolmea muuttujaa: käyttäjätunnus, isäntä, portti. Olin tyytyväinen elementin nimeen [sähköposti suojattu]: 5060, En ole löytänyt tilanteita, joissa sinun pitäisi käyttää kaikkia viittä muuttujaa.

Pääelementti, joka saa tiedot kaikista rekisteröinneistä, Asterisk - AMI SIPshowregistry. Kerran minuutissa se lähettää GET-pyynnön https://ats:8089/mxml?action=SIPshowregistry, jonka jälkeen vastaus XML-data välitetään kaikille riippuvaisille elementeille jäsentämistä varten. Jokaista rekisteröintiä varten luon siitä riippuvan elementin. Tämä on kätevää, koska saamme ajantasaiset tiedot yhdessä pyynnössä, emme jokaisesta pyynnöstä erikseen. Tällä toteutuksella on merkittävä haittapuoli - prosessorin kuormitus.

Kun testasin jopa 100 riippuvaa elementtiä, en huomannut kuormitusta, mutta 1700 elementillä tämä antoi huomattavan 15 sekunnin kuormituksen prosessorille. Pidä tämä mielessä, jos sinulla on suuri määrä riippuvia elementtejä.

Vaihtoehtona "hajauttaa" kuormaa tai asettaa eri kyselytaajuudet elementille, voit siirtää käsittelylogiikan jokaiseen elementtiin erikseen.

En tallenna vastaanotettuja tietoja pääelementtiin. Ensinnäkin en näe tarvetta tälle, ja toiseksi, jos vastaus on yli 64K, Zabbix katkaisee sen.

Koska käytämme täyttä XML-vastausta riippuvaiselle elementille, meidän on saatava tämän elementin arvo esikäsittelyssä. Kautta XPath se on tehty näin:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ osavaltio)
Rekisteröintitiloissa en käyttänyt tekstitiloja, vaan muunsin ne numeeriseen muotoon JavaScriptin avulla:

switch(value) {
  case 'Registered':
    return 1;
  case 'Unregistered':
    return 0;
  default:
    return -1;
}

SIP Peers

Analogisesti SIP-rekisteröintien kanssa, Asterisk - AMI SIPshowregistry -rekisterissä on pääelementti, johon lisätään riippuvaisia.

Tämä luo kaksi riippuvaista elementtiä:

  • Vertaistila tekstimuodossa
  • Laitteen vasteaika - jos tila on OK, kirjoitetaan laitteen vasteaika, muuten "-1"

Polku itse elementtiin on hieman yksinkertaisempi XPath:

string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)

Toisen elementin erottamiseen käytin JavaScriptiä vasteaika vertaistilasta, koska ne on tallennettu yhdessä:

if(value.substring(0,2) == 'OK'){
	return value.match(/(d+)/gm);
}
else {
	return -1;
}

Johtopäätös

Valmis ratkaisu voi olla monimutkainen eikä heti selkeä. Lisää joustavuutta ja siirrettävyyttä eri järjestelmien välillä

Hyvää ja helppoa integraatiota kaikille! Malli ja asennusohjeet GitHub.

Lähde: will.com

Lisää kommentti