วิธีเชื่อมต่อ Zabbix กับเครื่องหมายดอกจันนอกกรอบ

ในบทความก่อนหน้า "Zabbix - ขยายขอบเขตมาโคร" ฉันบอกคุณถึงวิธีรับเซสชันการอนุญาตและแทนที่เป็นแมโครโฮสต์ในเครื่อง ในบทความนี้ ฉันจะบอกวิธีเชื่อมต่อ Zabbix กับ Asterisk โดยไม่ต้องใช้สคริปต์และซอฟต์แวร์ภายนอก

แนวคิดในการ “ผูกมิตร” ของทั้งสองระบบนี้ถือกำเนิดขึ้นเมื่อนานมาแล้ว โดยไม่ต้องติดตั้งซอฟต์แวร์หรือสคริปต์เพิ่มเติม การใช้ Google อย่างรวดเร็วทำให้เกิดวิธีแก้ปัญหาที่เป็นไปได้มากมาย ทั้งหมดนี้รวมถึงการอัปโหลดสคริปต์ (ใน Pyha, Bash, Python ฯลฯ ) ไปยังเซิร์ฟเวอร์ แล้วคุณจะมีความสุข ฉันต้องการใช้การตรวจสอบแบบ "นอกกรอบ" - โดยไม่ต้องใช้สคริปต์ภายนอก และติดตั้งซอฟต์แวร์เพิ่มเติมบนเซิร์ฟเวอร์ที่มีการตรวจสอบและ PBX

ฉันใช้เวลาทั้งหมด 4 วันทำการกับสิ่งนี้ แต่ผลลัพธ์ก็คุ้มค่า การทำงานผ่านอินเทอร์เฟซ AMI การตรวจจับระดับต่ำ ทริกเกอร์ และที่สำคัญที่สุด การเชื่อมต่อ PBX และการตั้งค่าอื่นๆ ทั้งหมดใช้เวลาประมาณ 15 นาที

Zabbix 4.4 มีให้ใช้งาน Asterisk เวอร์ชัน 100 ประมาณ 13 ชิ้น PBX บางตัวมาพร้อมกับเว็บอินเตอร์เฟส FreePBX บางตัวมีคอนโซลเปล่า เทคนิคมากมายและการบูรณาการผ่าน dialplan

การรับข้อมูลจาก PBX

ประเด็นแรกและหลักที่ต้องแก้ไขคือการได้รับข้อมูลเกี่ยวกับเพียร์และการลงทะเบียน SIP เพื่อจุดประสงค์นี้ PBX มีอินเทอร์เฟซคอนโซล AGI, AMI, ARI และ SSH ด้วยเหตุผลที่ชัดเจน ฉันไม่ได้พิจารณาโมดูลเพิ่มเติม

ก่อนอื่นเราต้องหาก่อนว่า agi, ami, ari เหล่านี้คืออะไร...

  • AGI - การใช้สคริปต์ใน dialplan ส่วนใหญ่ใช้สำหรับการจัดการการโทร
  • AMI - สามารถให้ข้อมูลที่จำเป็นทั้งหมด ทำงานผ่านพอร์ต 5038 คล้ายกับ Telnet เหมาะกับเรา!
  • ARI - ทันสมัย ​​ทันสมัย ​​JSON มีความเป็นไปได้มากมาย รูปแบบข้อมูลเป็นที่เข้าใจได้สำหรับ Zabbix แต่สำหรับฉัน ไม่มีสิ่งสำคัญ: คุณไม่สามารถควบคุมการลงทะเบียนจิบได้ ข้อเสียอีกประการหนึ่งคือสำหรับเพื่อนนั้น มีเพียงสองสถานะออนไลน์/ออฟไลน์ แม้ว่าจะมีสถานะมากกว่านั้น และจะมีประโยชน์ที่จะนำมาพิจารณาเมื่อทำการวินิจฉัย
  • SSH สามารถทำทุกอย่างได้ แต่บางครั้งก็ไม่ได้รับอนุญาตเนื่องจาก “เหตุผลด้านความปลอดภัย” ข้อควรพิจารณาอาจแตกต่างกัน ฉันจะไม่พูดถึงมัน

อย่างไรก็ตาม ด้วยข้อบกพร่องทั้งหมด ARI จึงครอบคลุม 90% ของความต้องการในการตรวจสอบทั้งหมด

Zabbix และ Telnet - ความผิดหวังของฉัน

ฉันรู้จัก AMI เป็นอย่างดี ครั้งหนึ่งฉันใช้การติดตามการสูญเสียในการสนทนากับการแบ่งตามสำนักงานระยะไกล การจัดการการโทร ฯลฯ ด้วย Telnet ทุกอย่างก็ชัดเจนเช่นกัน: เปิดการเชื่อมต่อ ส่งคำสั่ง และอ่านคำตอบ นั่นคือสิ่งที่ฉันทำ แต่ผลลัพธ์ทำให้ฉันผิดหวัง

Telnet ใน Zabbix ไม่เหมือนกับในคอนโซล Linux แต่จะง่ายกว่าเล็กน้อยและได้รับการปรับแต่งสำหรับการอนุญาตมาตรฐาน เช่น การเข้าสู่ระบบ/รหัสผ่าน หากตรรกะการอนุญาตแตกต่างกัน และไม่มีการร้องขอคู่การเข้าสู่ระบบ/รหัสผ่าน แสดงว่าเกิดข้อผิดพลาด หลังจากพยายามหลีกเลี่ยงข้อกำหนดการอนุญาตอย่างไร้ผล การดูซอร์สโค้ดของโมดูล Telnet ก็มีประโยชน์

ฉันตระหนักว่าจนกว่าจะมีการร้องขอการเข้าสู่ระบบและรหัสผ่านแบบเดิมๆ ฉันจะไม่ก้าวไปข้างหน้า เพื่อความสนุกสนาน ฉันลบทุกอย่างที่เกี่ยวข้องกับการอนุญาตออกจากโค้ดและประกอบทุกอย่างใหม่ ได้ผล! แต่มันไม่เป็นไปตามข้อกำหนด ไปข้างหน้า…

กลับไปที่การค้นหากันเถอะ

ฉันอ่านเอกสาร ARI อีกครั้ง ทำการทดสอบเพิ่มเติม - ไม่มีการลงทะเบียน sip ที่นี่ มีงานเลี้ยง มีพูดคุย มีกางเกง แต่ไม่มีการลงทะเบียน เมื่อถึงจุดหนึ่งฉันก็คิดว่าเราจำเป็นต้องลงทะเบียนอีแร้งจริง ๆ หรือไม่?

โดยบังเอิญที่ตลกขบขัน ในขณะนี้ คำขออื่นมาถึงจากผู้ใช้ โดยมีปัญหากับการโทรออก ปัญหาคือการลงทะเบียน sip หยุดนิ่งและแก้ไขได้เพียงแค่รีบูตโมดูล

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>

คุณต้องทำงานที่นั่น 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: //ตอบกลับ/ทั่วไป[@โฮสต์]
จากนั้นความสนุกก็เริ่มต้นขึ้น หากต้องการทำงานกับการตรวจจับและสร้างองค์ประกอบแบบไดนามิก การตอบกลับจะต้องอยู่ในรูปแบบ JSON ไม่รองรับ XML สำหรับการตรวจหาอัตโนมัติ

ในการแปลง XML เป็น JSON ฉันต้องเล่นเล็กน้อยด้วยการแทนที่อัตโนมัติ ซึ่งฉันสร้างสคริปต์ใน JS

วิธีเชื่อมต่อ Zabbix กับเครื่องหมายดอกจันนอกกรอบ

จุดที่น่าสนใจ: ในการตอบกลับ ATS พารามิเตอร์ทั้งหมดจะล้อมรอบด้วยเครื่องหมายคำพูดเดี่ยว และหลังจากใช้เทมเพลตแล้ว //ตอบกลับ/ทั่วไป[@โฮสต์] พวกเขาจะถูกแทนที่ด้วยอันที่สอง

ในการสร้างองค์ประกอบ เราใช้ตัวแปรจากการตอบสนอง XML (ปัจจุบันคือ JSON)​

วิธีเชื่อมต่อ Zabbix กับเครื่องหมายดอกจันนอกกรอบ

รีจิสทรี SIP

สำหรับการลงทะเบียน 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:

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

สำหรับองค์ประกอบที่สอง ฉันใช้ JavaScript เพื่อแยก เวลาตอบสนอง จากสถานะเพียร์ เนื่องจากถูกจัดเก็บไว้ด้วยกัน:

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

ข้อสรุป

โซลูชันที่แกะกล่องอาจซับซ้อนและไม่ชัดเจนในทันที เพิ่มความยืดหยุ่นและความสะดวกในการพกพาระหว่างระบบต่างๆ

บูรณาการอย่างมีความสุขและง่ายดายทุกคน! เทมเพลตและคำแนะนำในการตั้งค่า GitHub.

ที่มา: will.com

เพิ่มความคิดเห็น