Ինչպես միացնել Zabbix-ը Asterisk-ի հետ տուփից դուրս

Մի նախորդ հոդվածում «Zabbix - ընդլայնելով մակրո սահմանները» Ես ձեզ ասացի, թե ինչպես ստանալ թույլտվության նիստ և այն փոխարինել տեղական հյուրընկալող մակրոյով: Այս հոդվածում ես ձեզ կասեմ, թե ինչպես կարելի է միացնել Zabbix-ը Asterisk-ի հետ առանց արտաքին սկրիպտների և ծրագրերի:

Այս երկու համակարգերին «ընկերանալու» գաղափարը ծնվել է շատ վաղուց՝ առանց լրացուցիչ ծրագրերի կամ սկրիպտների տեղադրման։ Արագ googling-ը տվեց բազմաթիվ հնարավոր լուծումներ, ամեն ինչ հանգեցրեց նրան, որ վերբեռնեք սկրիպտները (Pyha, Bash, Python և այլն) սերվեր, և դուք երջանիկ կլինեք: Ես ուզում էի իրականացնել մոնիտորինգ «դուրս արկղից»՝ առանց արտաքին սկրիպտների և սերվերի վրա լրացուցիչ ծրագրակազմ տեղադրել մոնիտորինգով և PBX-ով:

Ես ընդհանուր առմամբ 4 աշխատանքային օր եմ անցկացրել սրա հետ, բայց արդյունքն արժեր: AMI ինտերֆեյսի միջոցով աշխատելը, ցածր մակարդակի հայտնաբերումը, ձգանները և ամենակարևորը, PBX-ը և մյուս բոլոր կարգավորումները միացնելն այժմ տևում է մոտ 15 րոպե:

Զաբբիքս 4.4-ը հասանելի է, մոտ 100 կտոր Asterisk տարբերակ 13: Որոշ PBX-ներ գալիս են FreePBX վեբ ինտերֆեյսով, ոմանք՝ մերկ վահանակով, մի շարք հնարքներ և ինտեգրում թվային պլանի միջոցով:

PBX-ից տվյալների ստացում

Առաջին և հիմնական կետը, որը պետք է լուծվի, հասակակիցների և SIP գրանցումների վերաբերյալ տվյալներ ստանալն է: Այդ նպատակով PBX-ն ունի AGI, AMI, ARI և SSH կոնսոլային միջերեսներ: Հասկանալի պատճառներով ես չեմ դիտարկել լրացուցիչ մոդուլներ:

Նախ պետք է պարզել, թե ինչ են այս ագին, ամի, արի...

  • AGI - սկրիպտների օգտագործումը հավաքագրման պլանում: Հիմնականում օգտագործվում է զանգերի կառավարման համար:
  • AMI - կարող է տրամադրել բոլոր անհրաժեշտ տեղեկությունները, աշխատում է 5038 պորտի միջոցով, ինչպես Telnet-ը: Հարմար է մեզ!
  • ARI - ժամանակակից, նորաձև, JSON: Շատ հնարավորություններ կան, տվյալների ձևաչափը հասկանալի է Zabbix-ի համար, բայց ինձ համար հիմնական բան չկա. դուք չեք կարող վերահսկել կումերի գրանցումը: Մեկ այլ թերություն այն է, որ հասակակիցների համար կա միայն երկու վիճակ առցանց/օֆլայն, թեև ավելի շատ վիճակներ կան, և օգտակար է դրանք հաշվի առնել ախտորոշելիս:
  • SSH-ը կարող է ամեն ինչ անել, բայց երբեմն դա չի թույլատրվում «անվտանգության նկատառումներից ելնելով»։ Նկատառումները կարող են տարբեր լինել, ես չեմ խորանա դրանց մեջ:

Այնուամենայնիվ, իր բոլոր թերություններով հանդերձ, ARI-ն ծածկում է մոնիտորինգի բոլոր կարիքների 90%-ը:

Zabbix և Telnet - իմ հիասթափությունը

Ես լավ գիտեմ AMI-ին, ժամանակին ես իրականացրել էի կորուստների հետևում հեռավոր գրասենյակների բաժանման հետ զրույցներում, զանգերի կառավարում և այլն: Telnet-ով ամեն ինչ նույնպես շատ պարզ է՝ բացեք կապը, ուղարկեք հրամանները և կարդացեք պատասխանը։ Ես այդպես էլ արեցի, բայց արդյունքն ինձ հիասթափեցրեց։

Telnet-ը Zabbix-ում նույնը չէ, ինչ Linux-ի կոնսոլում, այն մի փոքր ավելի պարզ է և հարմարեցված ստանդարտ թույլտվության համար, ինչպիսին է մուտքի/գաղտնաբառը: Եթե ​​թույլտվության տրամաբանությունը տարբեր է, և մուտքի/գաղտնաբառի զույգի հարցում չկա, սխալ է տեղի ունենում: Թույլտվության պահանջը շրջանցելու ապարդյուն փորձերից հետո օգտակար էր դիտել Telnet մոդուլի սկզբնական կոդը:

Ես հասկացա, որ քանի դեռ ավանդական մուտքի և գաղտնաբառի հարցում չի եղել, ես առաջ չեմ գնա։ Պարզապես զվարճանալու համար ես կոդից հանեցի այն ամենը, ինչ կապված էր թույլտվության հետ և նորից հավաքեցի ամեն ինչ: Աշխատում է Բայց դա չի համապատասխանում պահանջներին։ Շարունակիր…

Վերադառնանք որոնմանը

Ես նորից կարդացի ARI-ի փաստաթղթերը, անցկացրի լրացուցիչ թեստեր. այստեղ կում-կում գրանցումներ չկան: Խնջույքներ կան, խոսակցություններ կան, վարտիքներ կան, բայց գրանցումներ չկան։ Ինչ-որ պահի ես նույնիսկ մտածեցի՝ իսկապե՞ս մեզ պետք է անգղի գրանցում։

Զավեշտալի զուգադիպությամբ այս պահին օգտատերից մեկ այլ հարցում է գալիս՝ ելքային զանգերի հետ կապված խնդրի հետ։ Խնդիրն այն էր, որ կումերի գրանցումը սառչում էր և լուծվում էր մոդուլը պարզապես վերագործարկելու միջոցով:

asterisk -rx "sip reload"

Հիանալի կլիներ ինտերնետի միջոցով մուտք գործել AMI. դա կլուծեր բոլոր խնդիրները, մտածեցի ես: Ես սկսում եմ փորել այս ուղղությամբ, և բառացիորեն առաջին որոնման տողը տանում է դեպի պաշտոնական Asterisk փաստաթուղթը, որն ասում է, որ կա իմ առաջադրանքների տարբերակ: webenabled ֆայլում /etc/asterisk/manager.conf, որը պետք է դրվի «ԱՅՈ» բաժնում [ընդհանուր]

Դրանից հետո ձևի սովորական վեբ հարցման միջոցով http://ats:8089/mxml?action=SIPshowregistry մենք ստանում ենք բոլոր անհրաժեշտ տեղեկությունները:

FreePBX ինտերֆեյսն օգտագործելիս դուք չեք կարող միացնել այս տարբերակը համացանցի միջոցով, դուք պետք է այն միացնեք վահանակի միջոցով՝ փոփոխություններ կատարելով manager.conf ֆայլում: FreePBX-ը չի ջնջում այն, երբ կոնֆիգուրացիայի փոփոխությունները կատարվում են համացանցի միջոցով:

Ես երկար ժամանակ աշխատել եմ Asterisk-ի տարբեր տեսակի ինտեգրացիաների հետ, բայց երբեք չեմ տեսել, որ այս հատկանիշը որևէ տեղ նշվի: Ես զարմացա, որ ոչ ոք չի նկարագրում PBX-ի հետ փոխգործակցության այս մեթոդը: Նույնիսկ հատկապես օգտակար էր այս թեմայի վերաբերյալ տեղեկատվություն փնտրելը. գործնականում ոչինչ չկա կամ այն ​​օգտագործվել է բոլորովին այլ խնդիրների համար:

WEB AMI - ինչպիսի՞ գազան:

Տարբերակի ավելացում webenabled ներկայացնել manager.conf ապահովվել է ԱԹՍ-ների կառավարման ամբողջական հասանելիություն համացանցի միջոցով: Սովորական AMI-ի միջոցով հասանելի բոլոր հրամաններն այժմ համացանցում են, դուք կարող եք իրադարձությունները լսել PBX-ից վարդակից: Գործողության սկզբունքը չի տարբերվում կոնսոլից AMI-ից: Այս տարբերակը ակտիվացնելուց հետո կարող եք կապվել PBX-ի հետ հետևյալ հասցեներով.

https://ats:8089/manager — պարզ ինտերֆեյսով վեբ էջ՝ հարցումները փորձարկելու և ձեռքով ուղարկելու համար: Բոլոր պատասխանները ֆորմատավորված են ընթեռնելի HTML-ի: Մոնիտորինգի համար շատ հարմար չէ:
https://ats:8089/rawman — միայն տեքստի ելք, ձևաչափ, որը նման է կոնսոլի AMI-ին
https://ats:8089/mxml - միայն տեքստային ելք, XML ձևաչափով: Հարմար է մեզ!

Ինչպես միացնել Zabbix-ը Asterisk-ի հետ տուփից դուրս

Հետո մտածեցի. «Սա է լուծումը։ Հիմա ամեն ինչ պատրաստ կլինի։ Հեշտ ցնդող կիտրոնի քամիչ», բայց դեռ վաղ էր ուրախանալու համար։ Մեզ անհրաժեշտ տեղեկատվությունը ստանալու համար բավական է օգտագործել 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>

Այնտեղ աշխատելու համար անհրաժեշտ է mansession_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: //response/generic[@host]
Հետո սկսվում է զվարճանքը: Հայտնաբերման հետ աշխատելու և տարրեր դինամիկ ստեղծելու համար պատասխանը պետք է լինի JSON ձևաչափով: XML-ը չի ապահովվում ավտոմատ հայտնաբերման համար:

XML-ը JSON-ի փոխարկելու համար ես ստիպված էի մի փոքր խաղալ ավտոմատ փոխարինմամբ, որի համար JS-ով սկրիպտ պատրաստեցի

Ինչպես միացնել Zabbix-ը Asterisk-ի հետ տուփից դուրս

Հետաքրքիր կետ. ATS-ի պատասխանում բոլոր պարամետրերը շրջապատված են մեկ չակերտներով, իսկ կաղապարը կիրառելուց հետո //response/generic[@host] դրանք փոխարինվում են կրկնակիներով։

Տարրեր ստեղծելու համար մենք օգտագործում ենք փոփոխականներ XML պատասխանից (այժմ՝ JSON):

Ինչպես միացնել Zabbix-ը Asterisk-ի հետ տուփից դուրս

SIP ռեգիստր

Սիպի գրանցման համար մենք օգտագործում ենք երեք փոփոխական. օգտագործողի անունը, հյուրընկալող, նավահանգիստ. Ես ուրախացա տարրի անունից [էլեկտրոնային փոստով պաշտպանված]: 5060, ես չեմ գտել որևէ իրավիճակ, որտեղ դուք պետք է օգտագործեք բոլոր հինգ փոփոխականները:

Հիմնական տարրը, որը տեղեկատվություն է ստանում բոլոր գրանցումների մասին, Աստղանիշ - AMI SIP ցույց գրանցամատյան. Րոպեը մեկ անգամ այն ​​կատարում է 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 գրանցումների անալոգիայով կա Asterisk-ի հիմնական տարրը՝ AMI SIPshowregistry, որին ավելացվում են կախյալները:

Սա ստեղծում է երկու կախված տարրեր.

  • Գործընկերների կարգավիճակը տեքստային ձևով
  • Սարքի արձագանքման ժամանակը - եթե կարգավիճակը նորմալ է, ապա սարքի արձագանքման ժամանակը գրված է, հակառակ դեպքում «-1»

Դեպի տարր տանող ճանապարհը մի փոքր ավելի պարզ է XPath:

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

Երկրորդ տարրի համար ես օգտագործել եմ JavaScript՝ առանձնացնելու համար պատասխան ժամանակ հասակակից կարգավիճակից, քանի որ դրանք պահվում են միասին.

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

Ամփոփում

Արտադրված լուծումը կարող է բարդ լինել և անհապաղ պարզ չլինել: Բարձրացնում է ճկունությունը և շարժականությունը տարբեր համակարգերի միջև

Ուրախ և հեշտ ինտեգրում բոլորին: Կաղապար և տեղադրման հրահանգներ GitHub.

Source: www.habr.com

Добавить комментарий