Zabbix'i kutudan çıktığı haliyle Yıldız işaretine bağlama

Bir önceki yazıda "Zabbix - makro sınırları genişletiyor" Yetkilendirme oturumunu nasıl alacağınızı ve bunu yerel bir ana bilgisayar makrosuna nasıl yerleştireceğinizi anlattım. Bu yazımda Zabbix'i Asterisk'e harici komut dosyaları ve yazılım olmadan nasıl bağlayacağınızı anlatacağım.

Bu iki sistemi "arkadaş edinme" fikri, ek yazılım veya komut dosyaları yüklemeden uzun zaman önce doğdu. Hızlı bir Google araması birçok olası çözümü ortaya çıkardı; bunların hepsi komut dosyalarını (Pyha, Bash, Python vb.) sunucuya yüklemeniz gerçeğine dayanıyordu ve mutlu olacaksınız. Harici komut dosyaları olmadan ve izleme ve PBX ile sunucuya ek yazılım yüklemeden "kutudan çıktığı gibi" izleme uygulamak istedim.

Bununla toplam 4 iş günü geçirdim ama sonuç buna değdi. AMI arayüzü, düşük seviye tespiti, tetikleyiciler ve en önemlisi PBX'e ve diğer tüm ayarlara bağlanmak artık yaklaşık 15 dakika sürüyor.

Zabbix 4.4 mevcuttur, yaklaşık 100 adet Asterisk sürüm 13'tür. Bazı PBX'ler FreePBX web arayüzüyle birlikte gelir, bazıları ise sade bir konsolla, bir dizi hileyle ve bir arama planı aracılığıyla entegrasyonla gelir.

PBX'ten veri alma

Çözülmesi gereken ilk ve temel nokta, eşler ve SIP kayıtları ile ilgili verilerin elde edilmesidir. Bu amaçla PBX'te AGI, AMI, ARI ve SSH konsol arayüzleri bulunmaktadır. Açık nedenlerden dolayı ek modülleri dikkate almadım.

Öncelikle bu agi, ami, ari'nin ne olduğunu bulmalıyız...

  • AGI - arama planındaki komut dosyalarını kullanma. Esas olarak çağrı yönetimi için kullanılır.
  • AMI - gerekli tüm bilgileri sağlayabilir, Telnet'e benzer şekilde 5038 numaralı bağlantı noktası üzerinden çalışır. Bize uyar!
  • ARI - modern, modaya uygun, JSON. Pek çok olasılık var, veri formatı Zabbix için anlaşılabilir, ancak benim için önemli olan bir şey yok: yudum kaydını kontrol edemezsiniz. Diğer bir dezavantaj, akranlar için çevrimiçi/çevrimdışı yalnızca iki durumun bulunmasıdır, ancak daha fazla durum vardır ve tanı koyarken bunları dikkate almanın yararlı olduğu söylenebilir.
  • SSH her şeyi yapabilir ancak bazen “güvenlik nedeniyle” buna izin verilmiyor. Düşünceler farklı olabilir, onlara girmeyeceğim.

Ancak ARI, tüm eksiklikleriyle birlikte tüm izleme ihtiyaçlarının %90'ını karşılamaktadır.

Zabbix ve Telnet - hayal kırıklığım

AMI'yi iyi tanıyorum; bir zamanlar uzak ofisler, çağrı yönetimi vb. ile yapılan görüşmelerdeki kayıpların takibini uyguladım. Telnet'te de her şey çok net: bağlantıyı açın, komutları gönderin ve yanıtı okuyun. Ben de öyle yaptım ama sonuç beni hayal kırıklığına uğrattı.

Zabbix'teki Telnet, Linux konsolundaki ile aynı değildir, biraz daha basittir ve kullanıcı adı/şifre gibi standart yetkilendirmeye göre uyarlanmıştır. Yetkilendirme mantığı farklıysa ve kullanıcı adı/şifre çifti için istek yoksa bir hata oluşur. Yetkilendirme gereksinimini aşmaya yönelik nafile girişimlerden sonra Telnet modülünün kaynak koduna bakmak faydalı oldu.

Geleneksel bir giriş ve şifre talebi olana kadar ilerlemeyeceğimi fark ettim. Sırf eğlence olsun diye, yetkilendirmeyle ilgili her şeyi koddan kaldırdım ve her şeyi yeniden birleştirdim. İşler! Ama gereksinimleri karşılamıyor. Devam etmek…

Aramaya geri dönelim

ARI belgelerini tekrar okudum, ek testler yaptım - burada yudum kaydı yok. Ziyafetler var, sohbetler var, pantolonlar var ama kayıt yok. Bir noktada akbaba kaydına gerçekten ihtiyacımız var mı diye düşündüm.

Komik bir tesadüf eseri, şu anda kullanıcıdan giden aramalarla ilgili bir sorunla ilgili başka bir istek geliyor. Sorun, yudum kaydının donmasıydı ve modülün yeniden başlatılmasıyla çözüldü.

asterisk -rx "sip reload"

AMI'ye web üzerinden erişmek harika olurdu; bunun tüm sorunları çözeceğini düşündüm. Bu yönde kazmaya başlıyorum ve kelimenin tam anlamıyla ilk arama satırı, görevlerim için bir seçenek olduğunu söyleyen resmi Yıldız işareti belgelerine yönlendiriyor web etkin dosyada /etc/asterisk/manager.confbölümünde EVET olarak ayarlanması gerekir. [genel]

Bundan sonra formun düzenli bir web isteği aracılığıyla http://ats:8089/mxml?action=SIPshowregistry gerekli tüm bilgileri alıyoruz.

FreePBX arayüzünü kullanırken bu seçeneği web üzerinden etkinleştiremezsiniz; yönetici.conf dosyasında değişiklik yaparak konsol üzerinden etkinleştirmeniz gerekir. FreePBX, web üzerinden konfigürasyon değişiklikleri yapıldığında bunu silmez.

Uzun zamandır çeşitli yıldız işareti entegrasyonlarıyla çalıştım ancak bu özelliğin hiçbir yerde bahsedildiğini görmedim. Hiç kimsenin PBX ile etkileşime geçmenin bu yöntemini açıklamamasına şaşırdım. Bu konuyla ilgili bilgi aramak bile özellikle faydalıydı: pratikte hiçbir şey yok veya tamamen farklı görevler için kullanılıyordu.

WEB AMI - ne tür bir canavar?

Bir seçenek ekleme web etkin dosyalamak yönetici.conf web üzerinden ATS yönetimine tam erişim sağladı. Normal bir AMI aracılığıyla kullanılabilen tüm komutlar artık web'dedir; PBX'teki olayları bir soket aracılığıyla dinleyebilirsiniz. Çalışma prensibi AMI konsolundan farklı değildir. Bu seçeneği etkinleştirdikten sonra PBX ile aşağıdaki adreslerden iletişime geçebilirsiniz:

https://ats:8089/manager — istekleri test etmek ve manuel olarak göndermek için basit bir arayüze sahip bir web sayfası. Tüm yanıtlar okunabilir HTML olarak biçimlendirilmiştir. İzlemeye pek uygun değil.
https://ats:8089/rawman — yalnızca metin çıkışı, konsol AMI'sine benzer format
https://ats:8089/mxml - yalnızca XML biçiminde metin çıktısı. Bize uyar!

Zabbix'i kutudan çıktığı haliyle Yıldız işaretine bağlama

Sonra düşündüm: “Çözüm bu! Artık her şey hazır olacak! Kolay-peezy limon sıkacağı” ama sevinmek için henüz çok erkendi. İhtiyacımız olan bilgiyi elde etmek için gerekli aksiyonla birlikte GET isteğini kullanmak yeterlidir. aksiyonyanıt olarak tüm kayıtların ve durumlarının bir listesini içeren xml'yi döndürür. Bunların hepsi harika, ancak çerezden oturumu hatırlamak için izne ihtiyacınız var. Tarayıcıda test yaptığınızda bu süreci düşünmüyorsunuz.

Yetkilendirme süreci

İlk önce adresi veriyoruz http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, yanıt olarak sunucu bize yetkilendirme oturumuyla birlikte bir çerez gönderir. Bir HTTP isteği şöyle görünür:

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

Cevap:

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>

Orada çalışmak için ihtiyacın var konak_id="6f5de42c", yani yetkilendirme çerezinin kendisi.
Cevabı için kontrol etmeniz gereken içerik "Kimlik doğrulama kabul edildi" Daha sonra, PBX sunucusuna yapılan tüm aramalar için isteğe bir yetkilendirme çerezi eklememiz gerekecek.

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

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

Yetkilendirme çerezini nasıl alacağınızı ve onu diğer isteklerde nasıl kullanacağınızı buradan okuyun: “Zabbix - genişleyen makro sınırları»

Zabbix'te izleme öğeleri oluşturmak için otomatik algılamayı kullanacağım.

Otomatik algılama

Kayıtları otomatik olarak tespit etmek ve akran durumlarını takip etmek için aşağıdaki adresle iletişime geçmeniz gerekir: https://ats:8089/mxml?action=SIPshowregistry veya https://ats:8089/mxml?action=SIPpeers

Yanıt olarak PBX bize bir XML yanıtı döndürür:

<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>

Yanıtta çok fazla çöp var, bu nedenle ön işlemede onu şablona göre filtreliyoruz XPath: //yanıt/genel[@ana bilgisayar]
Sonra eğlence başlıyor. Algılamayla çalışmak ve öğeleri dinamik olarak oluşturmak için yanıtın JSON biçiminde olması gerekir. Otomatik algılamalar için XML desteklenmez.

XML'i JSON'a dönüştürmek için, JS'de bir komut dosyası hazırladığım otomatik değiştirmeyle biraz oynamak zorunda kaldım

Zabbix'i kutudan çıktığı haliyle Yıldız işaretine bağlama

İlginç bir nokta: ATS yanıtında tüm parametreler tek tırnak içine alınır ve şablon uygulandıktan sonra //yanıt/genel[@ana bilgisayar] bunların yerini çift olanlar alır.

Öğeler oluşturmak için XML yanıtındaki (şimdi JSON) değişkenleri kullanırız.

Zabbix'i kutudan çıktığı haliyle Yıldız işaretine bağlama

SIP Kaydı

Sip kayıtları için üç değişken kullanıyoruz: kullanıcı adı, ev sahibi, Liman. Elementin adından memnun kaldım [e-posta korumalı]: 5060, Beş değişkenin tümünü kullanmanız gereken herhangi bir durum bulamadım.

Tüm kayıtlar hakkında bilgi alan ana unsur, Yıldız işareti - AMI SIP gösteri kaydı. Dakikada bir kez GET isteğinde bulunur https://ats:8089/mxml?action=SIPshowregistry, ardından yanıt XML verileri ayrıştırılmak üzere tüm bağımlı öğelere iletilir. Her kayıt için ona bağlı bir öğe oluşturuyorum. Bu kullanışlıdır çünkü güncel bilgileri her istek için ayrı ayrı değil, tek bir istekte alırız. Bu uygulamanın önemli bir dezavantajı var - işlemci üzerindeki yük.

100'e kadar bağımlı öğeyi test ederken yükü fark etmedim, ancak 1700 öğeyle bu, işlemciye 15 saniyelik gözle görülür bir yük verdi. Çok sayıda bağımlı öğeniz varsa bunu aklınızda bulundurun.

Yükü "yaymak" veya bir öğe için farklı yoklama frekansları ayarlamak için bir seçenek olarak, işleme mantığını her bir öğeye ayrı ayrı taşıyabilirsiniz.

Alınan bilgileri ana öğede saklamıyorum. Öncelikle buna gerek görmüyorum ve ikinci olarak eğer yanıt 64K’dan fazla ise Zabbix kesiyor.

Bağımlı öğe için tam bir XML yanıtı kullandığımızdan, bu öğenin değerini ön işlemede almamız gerekir. Başından sonuna kadar XPath şu şekilde yapılır:
string(//response/generic[@event = "RegistryEntry"] durum)
Kayıt durumları için metin durumlarını kullanmadım, ancak bunları JavaScript kullanarak sayısal forma dönüştürdüm:

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

SIP Eşleri

SIP kayıtlarına benzer şekilde, bağımlı olanların eklendiği Yıldız İşareti - AMI SIPshowregistry'nin ana unsuru vardır.

Bu iki bağımlı öğe oluşturur:

  • Metin biçiminde akran durumu
  • Cihaz yanıt süresi - eğer durum iyiyse, cihazın yanıt süresi yazılır, aksi takdirde “-1”

Elemanın kendisine giden yol biraz daha basit XPath:

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

İkinci öğeyi ayırmak için JavaScript kullandım Tepki Süresi birlikte depolandıkları için eş durumundan:

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

Sonuç

Kullanıma hazır bir çözüm karmaşık olabilir ve hemen anlaşılamayabilir. Farklı sistemler arasında esnekliği ve taşınabilirliği artırır

Herkese mutlu ve kolay entegrasyon! Kurulum için şablon ve talimatlar GitHub.

Kaynak: habr.com

Yorum ekle