Zabbix-ийг Одтой хэрхэн холбох вэ

Өмнөх нийтлэлд "Заббикс - макро хил хязгаарыг өргөжүүлэх" Би танд зөвшөөрлийн сессийг хэрхэн хүлээн авч, түүнийг локал хостын макро руу орлуулах талаар хэлсэн. Энэ нийтлэлд би Zabbix-ийг одтой хэрхэн холбохыг танд хэлэх болно, ямар ч гадаад скрипт, програм хангамжгүйгээр.

Нэмэлт программ хангамж, скрипт суулгахгүйгээр энэ хоёр системтэй "найз болох" санаа нэлээд эртнээс төрсөн. Шуурхай Google хайлт нь олон боломжит шийдлүүдийг гаргаж өгсөн бөгөөд энэ нь бүгд скриптүүдийг (Pyha, Bash, Python гэх мэт) серверт байршуулснаар та баяртай байх болно. Би "хайрцагнаас гадуур" хяналтыг хэрэгжүүлэхийг хүссэн - гадны скриптгүйгээр, хяналт, PBX бүхий сервер дээр нэмэлт програм хангамж суулгах.

Би үүнд нийт 4 ажлын өдөр зарцуулсан ч үр дүн нь үнэ цэнэтэй байсан. AMI интерфэйс, доод түвшний илрүүлэлт, гох, хамгийн чухал нь PBX болон бусад бүх тохиргоог холбоход 15 минут зарцуулагдана.

Zabbix 4.4, Asterisk хувилбар 100-ын 13 орчим ширхэг байгаа. Зарим PBX нь FreePBX вэб интерфэйстэй, зарим нь нүцгэн консолтой, олон заль мэх, залгах шугамаар нэгтгэгддэг.

PBX-ээс мэдээлэл хүлээн авч байна

Шийдэх ёстой хамгийн эхний бөгөөд гол зүйл бол үе тэнгийнхэн болон SIP бүртгэлийн талаарх мэдээллийг олж авах явдал юм. Энэ зорилгоор PBX нь AGI, AMI, ARI, SSH консол интерфейстэй. Тодорхой шалтгааны улмаас би нэмэлт модулиудыг авч үзээгүй.

Эхлээд бид эдгээр аги, ами, ари гэж юу болохыг олж мэдэх хэрэгтэй.

  • AGI - залгах төлөвлөгөөнд скрипт ашиглах. Голчлон дуудлагын менежментэд ашигладаг.
  • AMI - шаардлагатай бүх мэдээллийг өгөх боломжтой, Telnet-тэй төстэй 5038 портоор ажилладаг. Бидэнд тохирсон!
  • ARI - орчин үеийн, загварлаг, JSON. Олон боломжууд байдаг, өгөгдлийн формат нь Zabbix-д ойлгомжтой, гэхдээ миний хувьд гол зүйл байхгүй: та шимэгчийн бүртгэлийг хянах боломжгүй. Өөр нэг сул тал бол үе тэнгийнхний хувьд зөвхөн онлайн/офлайн хоёр муж байдаг, гэхдээ илүү олон муж байдаг бөгөөд оношлохдоо тэдгээрийг харгалзан үзэх нь ашигтай байдаг.
  • SSH бүх зүйлийг хийх боломжтой боловч заримдаа "аюулгүй байдлын шалтгаанаар" үүнийг зөвшөөрдөггүй. Санал бодол нь өөр байж магадгүй, би тэдгээрт орохгүй.

Гэсэн хэдий ч бүх дутагдалтай талуудтай ARI нь мониторингийн бүх хэрэгцээний 90% -ийг хамардаг.

Zabbix болон Telnet - миний урам хугарсан

Би AMI-г сайн мэднэ; нэг удаа би алслагдсан оффисууд, дуудлагын менежмент гэх мэт хэлтэстэй харилцахдаа алдагдлыг хянах ажлыг хэрэгжүүлсэн. Telnet-ийн тусламжтайгаар бүх зүйл маш тодорхой байна: холболтыг нээж, командуудыг илгээж, хариултыг уншина уу. Би ийм зүйл хийсэн ч үр дүн нь миний урмыг хугалсан.

Zabbix дахь Telnet нь Линукс консолтой адил биш бөгөөд энэ нь арай хялбар бөгөөд нэвтрэх/нууц үг гэх мэт стандарт зөвшөөрөлд зориулагдсан. Хэрэв зөвшөөрлийн логик өөр бөгөөд нэвтрэх/нууц үгийн хос хүсэлт байхгүй бол алдаа гарна. Зөвшөөрлийн шаардлагыг давах гэсэн дэмий оролдлого хийсний дараа Telnet модулийн эх кодыг үзэх нь ашигтай байсан.

Уламжлалт нэвтрэх болон нууц үгийн хүсэлт гарах хүртэл би урагшлахгүй гэдгийг ойлгосон. Зүгээр л хөгжилтэй байхын тулд би зөвшөөрөлтэй холбоотой бүх зүйлийг кодноос хасч, бүгдийг нь угсарсан. Ажиллаж байна! Гэвч шаардлага хангахгүй байна. Цаашаа…

Хайлт руугаа буцъя

Би ARI-ийн баримт бичгийг дахин уншиж, нэмэлт шалгалт хийсэн - энд ямар ч шимтгэлийн бүртгэл байхгүй. Баяр наадам, яриа хөөрөө, өмд өмссөн ч бүртгэл алга. Хэзээ нэгэн цагт надад тас шувууны бүртгэл үнэхээр хэрэгтэй юу?

Инээдтэй тохиолдлоор яг энэ мөчид хэрэглэгчээс гарч буй дуудлагатай холбоотой өөр хүсэлт ирсэн байна. Асуудал нь шимтгэлийн бүртгэл хөлдсөн байсан бөгөөд модулийг зүгээр л дахин ачаалснаар шийдэгдсэн юм.

asterisk -rx "sip reload"

AMI-д вэбээр хандах нь үнэхээр сайхан байх болно: энэ нь бүх асуудлыг шийдэх болно гэж би бодлоо. Би энэ чиглэлд ухаж эхэлсэн бөгөөд шууд утгаараа хайлтын эхний мөр нь албан ёсны одны баримт бичигт хүргэдэг бөгөөд энэ нь миний даалгаврын сонголт байгаа гэсэн үг юм. вэбээр идэвхжүүлсэн файлд /etc/asterisk/manager.confхэсэгт YES гэж тохируулах шаардлагатай [ерөнхий]

Үүний дараа маягтын байнгын вэб хүсэлтээр дамжуулан http://ats:8089/mxml?action=SIPshowregistry Бид шаардлагатай бүх мэдээллийг авдаг.

FreePBX интерфэйсийг ашиглах үед та энэ сонголтыг вэбээр идэвхжүүлэх боломжгүй, та manager.conf файлд өөрчлөлт оруулан консолоор дамжуулан идэвхжүүлэх хэрэгтэй. Тохиргооны өөрчлөлтийг вэбээр хийх үед FreePBX үүнийг арилгадаггүй.

Би олон төрлийн одтой интеграцчилалтай удаан хугацаанд ажиллаж байсан ч энэ функцийг хаана ч дурьдсаныг хэзээ ч харж байгаагүй. PBX-тэй харилцах энэ аргыг хэн ч тайлбарлаагүйд би гайхсан. Энэ сэдвээр мэдээлэл хайх нь ялангуяа ашигтай байсан: бараг юу ч байхгүй эсвэл огт өөр ажилд ашигласан.

WEB AMI - ямар араатан бэ?

Сонголт нэмж байна вэбээр идэвхжүүлсэн файл болгох manager.conf вэбээр дамжуулан ATS-ийн удирдлагад бүрэн нэвтрэх боломжийг олгосон. Энгийн AMI-ээр дамжуулан ашиглах боломжтой бүх тушаалууд одоо вэб дээр байгаа тул та PBX-ээс үйл явдлыг залгуураар сонсох боломжтой. Үйл ажиллагааны зарчим нь AMI консолоос ялгаатай биш юм. Энэ сонголтыг идэвхжүүлсний дараа та дараах хаягаар PBX-тэй холбогдож болно.

https://ats:8089/manager — хүсэлтийг турших, гараар илгээх энгийн интерфейстэй вэб хуудас. Бүх хариултыг унших боломжтой HTML хэлбэрээр форматласан. Хяналт хийхэд тийм ч тохиромжтой биш.
https://ats:8089/rawman — зөвхөн текст гаралт, консол AMI-тай төстэй формат
https://ats:8089/mxml - зөвхөн XML форматаар текст гаралт. Бидэнд тохирсон!

Zabbix-ийг Одтой хэрхэн холбох вэ

Дараа нь би бодлоо: "Энэ бол шийдэл! Одоо бүх зүйл бэлэн болно! Хялбар шарсан нимбэг” гэж хэлсэн ч баярлахад эрт байна. Бидэнд хэрэгтэй мэдээллийг авахын тулд шаардлагатай үйлдлээр GET хүсэлтийг ашиглахад хангалттай үйл ажиллагаа, хариуд нь бүх бүртгэлийн жагсаалт болон тэдгээрийн статусын хамт xml-г буцаана. Энэ бүхэн гайхалтай, гэхдээ күүки дэх сессийг санахын тулд танд зөвшөөрөл хэрэгтэй. Та хөтөч дээр тест хийхдээ энэ үйл явцын талаар огт боддоггүй.

Зөвшөөрлийн үйл явц

Эхлээд бид хаягийг зааж өгнө http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, хариуд нь сервер бидэнд зөвшөөрлийн сесс бүхий күүки илгээдэг. HTTP хүсэлт дараах байдалтай байна.

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

Хариулт:

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>

Тэнд ажиллахын тулд танд хэрэгтэй харшийн_id="6f5de42c", өөрөөр хэлбэл зөвшөөрлийн күүки өөрөө.
Та хариултыг шалгахад л хангалттай"Баталгаажуулалтыг хүлээн зөвшөөрсөн" Дараа нь PBX сервер рүү хийсэн бүх дуудлагын хувьд бид хүсэлтэд зөвшөөрлийн күүки нэмэх шаардлагатай болно.

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

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

Зөвшөөрлийн күүкийг хэрхэн авч, бусад хүсэлтэд ашиглах талаар эндээс уншина уу: "Zabbix - макро хил хязгаарыг өргөжүүлэх»

Zabbix-д мөрдөх элементүүдийг үүсгэхийн тулд би автомат илрүүлэлтийг ашиглах болно.

Автомат илрүүлэх

Бүртгэлийг автоматаар илрүүлэх, үе тэнгийн төлөвийг хянахын тулд та дараах хаягаар холбоо барина уу. https://ats:8089/mxml?action=SIPshowregistry буюу https://ats:8089/mxml?action=SIPpeers

Үүний хариуд PBX бидэнд XML хариултыг буцаана:

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

Хариултанд маш их хог хаягдал байгаа тул урьдчилан боловсруулахдаа бид үүнийг загвараар шүүдэг XPath: //хариу/ерөнхий[@host]
Дараа нь зугаа цэнгэл эхэлнэ. Илрүүлэхтэй ажиллах, элементүүдийг динамикаар үүсгэхийн тулд хариу нь JSON форматтай байх ёстой. XML-г автоматаар илрүүлэхэд дэмждэггүй.

XML-ийг JSON болгон хөрвүүлэхийн тулд би автоматаар солих програмыг бага зэрэг тоглох шаардлагатай болсон бөгөөд үүний тулд JS дээр скрипт хийсэн.

Zabbix-ийг Одтой хэрхэн холбох вэ

Сонирхолтой зүйл: ATS-ийн хариултанд бүх параметрүүд нь нэг хашилтаар хүрээлэгдсэн бөгөөд загварыг хэрэглэсний дараа //хариу/ерөнхий[@host] тэдгээрийг давхар нэгээр сольсон.

Элемент үүсгэхийн тулд бид XML хариултын хувьсагчдыг ашигладаг (одоо JSON).

Zabbix-ийг Одтой хэрхэн холбох вэ

SIP бүртгэл

Сип бүртгэлийн хувьд бид гурван хувьсагчийг ашигладаг: хэрэглэгчийн нэр, хост, порт. Би элементийн нэрэнд баяртай байсан [имэйлээр хамгаалагдсан]: 5060, Та бүх таван хувьсагчийг ашиглах шаардлагатай нөхцөл байдлыг би олсонгүй.

Бүх бүртгэлийн талаарх мэдээллийг хүлээн авдаг гол элемент, Од - AMI SIPshowregistry. Энэ нь минут тутамд нэг удаа GET хүсэлт гаргадаг https://ats:8089/mxml?action=SIPshowregistry, үүний дараа хариу XML өгөгдлийг задлан шинжлэхийн тулд бүх хамааралтай элементүүдэд дамжуулна. Бүртгэл бүрийн хувьд би үүнээс хамааралтай элемент үүсгэдэг. Бид хамгийн сүүлийн үеийн мэдээллийг нэг хүсэлтээр хүлээн авдаг бөгөөд хүсэлт бүрийг тусад нь авдаггүй тул энэ нь тохиромжтой. Энэ хэрэгжилт нь мэдэгдэхүйц сул талтай - процессорын ачаалал.

100 хүртэлх хамааралтай элементүүдийг туршихдаа би ачааллыг анзаараагүй боловч 1700 элементтэй бол процессор дээр 15 секундын мэдэгдэхүйц ачааллыг өгсөн. Хэрэв танд олон тооны хамааралтай элементүүд байгаа бол үүнийг санаарай.

Ачааллыг "тархах" эсвэл элементийн санал асуулгын өөр давтамжийг тохируулах сонголтын хувьд та боловсруулалтын логикийг элемент бүрд тусад нь шилжүүлж болно.

Би хүлээн авсан мэдээллийг үндсэн элементэд хадгалдаггүй. Нэгдүгээрт, би үүнийг хийх шаардлагагүй гэж харж байна, хоёрдугаарт, хэрэв хариулт 64K-ээс их байвал Zabbix үүнийг тасална.

Бид хамааралтай элементийн бүрэн XML хариултыг ашигладаг тул урьдчилан боловсруулахдаа энэ элементийн утгыг авах хэрэгтэй. дамжуулан XPath Энэ нь иймэрхүү байдлаар хийгдсэн:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ муж)
Бүртгэлийн статусын хувьд би текст статусыг ашиглаагүй, харин JavaScript ашиглан тоон хэлбэрт хөрвүүлсэн:

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

SIP үе тэнгийнхэн

SIP бүртгэлтэй ижил төстэй байдлаар Оддын үндсэн элемент - AMI SIPshowregistry байдаг бөгөөд үүнд хамааралтай хүмүүсийг нэмж оруулсан болно.

Энэ нь хоёр хамааралтай элементийг үүсгэдэг:

  • Текст хэлбэрээр үе тэнгийн статус
  • Төхөөрөмжийн хариу өгөх хугацаа - хэрэв төлөв хэвийн байвал төхөөрөмжийн хариу өгөх хугацаа бичигдэнэ, үгүй ​​бол "-1"

Элемент рүү хүрэх зам нь өөрөө арай хялбар юм XPath:

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

Хоёрдахь элементийн хувьд би JavaScript-г салгахад ашигласан хариу цаг Хамтдаа хадгалагдсан тул үе тэнгийн статусаас:

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

дүгнэлт

Бэлэн болсон шийдэл нь нарийн төвөгтэй бөгөөд нэн даруй тодорхой бус байж болно. Янз бүрийн системүүдийн хооронд уян хатан байдал, зөөвөрлөх чадварыг нэмэгдүүлдэг

Бүгдэд нь аз жаргалтай, хялбар интеграцчилал! Загвар ба тохируулах заавар GitHub.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх