Cách kết nối Zabbix với Asterisk ngay lập tức

Trong một bài viết trước "Zabbix - mở rộng ranh giới vĩ mô" Tôi đã nói với bạn cách nhận phiên ủy quyền và thay thế nó thành macro máy chủ cục bộ. Trong bài viết này tôi sẽ hướng dẫn bạn cách kết nối Zabbix với Asterisk mà không cần tập lệnh và phần mềm bên ngoài.

Ý tưởng “kết bạn” của hai hệ thống này đã ra đời từ lâu mà không cần cài đặt thêm phần mềm hay tập lệnh. Việc tìm kiếm nhanh trên Google mang lại nhiều giải pháp khả thi, tất cả đều tập trung vào thực tế là tải các tập lệnh (bằng Pyha, Bash, Python, v.v.) lên máy chủ và bạn sẽ rất vui. Tôi muốn triển khai giám sát “ngay lập tức” - không có tập lệnh bên ngoài và cài đặt phần mềm bổ sung trên máy chủ có tính năng giám sát và PBX.

Tôi đã dành tổng cộng 4 ngày làm việc cho việc này, nhưng kết quả thật xứng đáng. Làm việc thông qua giao diện AMI, phát hiện mức độ thấp, kích hoạt và quan trọng nhất là kết nối PBX và tất cả các cài đặt khác hiện mất khoảng 15 phút.

Zabbix 4.4 đã có sẵn, khoảng 100 mẩu Asterisk phiên bản 13. Một số PBX đi kèm với giao diện web FreePBX, một số có bảng điều khiển đơn giản, một loạt thủ thuật và tích hợp thông qua sơ đồ quay số.

Nhận dữ liệu từ PBX

Điểm đầu tiên và chính cần được giải quyết là lấy dữ liệu về các thiết bị ngang hàng và đăng ký SIP. Với mục đích này, PBX có giao diện bảng điều khiển AGI, AMI, ARI và SSH. Vì những lý do hiển nhiên, tôi đã không xem xét các mô-đun bổ sung.

Đầu tiên chúng ta cần tìm hiểu những agi, ami, ari này là gì...

  • AGI - sử dụng tập lệnh trong dialplan. Chủ yếu được sử dụng để quản lý cuộc gọi.
  • AMI - có thể cung cấp mọi thông tin cần thiết, hoạt động qua cổng 5038, tương tự như Telnet. Phù hợp với chúng tôi!
  • ARI - hiện đại, thời trang, JSON. Có rất nhiều khả năng, định dạng dữ liệu có thể hiểu được đối với Zabbix, nhưng đối với tôi không có vấn đề chính nào: bạn không thể kiểm soát việc đăng ký ngụm. Một nhược điểm khác là đối với các đồng nghiệp chỉ có hai trạng thái trực tuyến/ngoại tuyến, mặc dù có nhiều trạng thái hơn và sẽ rất hữu ích khi tính đến chúng khi chẩn đoán.
  • SSH có thể làm được mọi thứ nhưng đôi khi nó không được phép vì “lý do bảo mật”. Những cân nhắc có thể khác nhau, tôi sẽ không đi sâu vào chúng.

Tuy nhiên, với tất cả những thiếu sót của mình, ARI đáp ứng được 90% tất cả các nhu cầu giám sát.

Zabbix và Telnet - sự thất vọng của tôi

Tôi biết rõ về AMI, đã có lần tôi thực hiện theo dõi tổn thất trong các cuộc trò chuyện với bộ phận của các văn phòng ở xa, quản lý cuộc gọi, v.v. Với Telnet, mọi thứ cũng rất rõ ràng: mở kết nối, gửi lệnh và đọc phản hồi. Đó là những gì tôi đã làm, nhưng kết quả làm tôi thất vọng.

Telnet trong Zabbix không giống như trong bảng điều khiển Linux, nó đơn giản hơn một chút và được điều chỉnh cho ủy quyền tiêu chuẩn như đăng nhập/mật khẩu. Nếu logic ủy quyền khác và không có yêu cầu về cặp thông tin đăng nhập/mật khẩu thì sẽ xảy ra lỗi. Sau những nỗ lực vô ích để bỏ qua yêu cầu ủy quyền, việc xem xét mã nguồn của mô-đun Telnet là rất hữu ích.

Tôi nhận ra rằng cho đến khi có yêu cầu đăng nhập và mật khẩu truyền thống, tôi sẽ không tiếp tục. Để giải trí, tôi đã xóa mọi thứ liên quan đến ủy quyền khỏi mã và tập hợp lại mọi thứ. Làm! Nhưng nó không đáp ứng được yêu cầu. Hãy tiếp tục…

Hãy quay lại tìm kiếm

Tôi đọc lại tài liệu ARI, chạy thử nghiệm bổ sung - không có đăng ký ngụm nào ở đây. Có những bữa tiệc, có những cuộc trò chuyện, có những chiếc quần ống túm, nhưng không có đăng ký. Thậm chí có lúc tôi còn nghĩ, chúng ta có thực sự cần đăng ký kền kền không?

Thật trùng hợp ngẫu nhiên, đúng lúc này, một yêu cầu khác đến từ người dùng liên quan đến vấn đề cuộc gọi đi. Vấn đề là việc đăng ký ngụm bị treo và được giải quyết bằng cách khởi động lại mô-đun.

asterisk -rx "sip reload"

Sẽ thật tuyệt nếu truy cập AMI qua web: điều đó sẽ giải quyết được mọi vấn đề, tôi nghĩ vậy. Tôi bắt đầu tìm hiểu theo hướng này và theo đúng nghĩa đen, dòng tìm kiếm đầu tiên dẫn đến tài liệu Asterisk chính thức, trong đó nói rằng có một tùy chọn cho nhiệm vụ của tôi đã bỏ qua trong tập tin /etc/asterisk/manager.conf, cần được đặt thành CÓ, trong phần [Tổng quan]

Sau đó, thông qua một yêu cầu web thông thường có dạng http://ats:8089/mxml?action=SIPshowregistry chúng tôi nhận được tất cả các thông tin cần thiết.

Khi sử dụng giao diện FreePBX, bạn không thể kích hoạt tùy chọn này qua web, bạn cần kích hoạt nó thông qua bảng điều khiển bằng cách thực hiện các thay đổi đối với tệp manager.conf. FreePBX không xóa nó khi thay đổi cấu hình được thực hiện qua web.

Tôi đã làm việc với nhiều loại tích hợp Asterisk khác nhau trong một thời gian dài, nhưng tôi chưa bao giờ thấy tính năng này được đề cập ở bất cứ đâu. Tôi rất ngạc nhiên khi không ai mô tả phương pháp tương tác với PBX này. Việc tìm kiếm thông tin về chủ đề này thậm chí còn đặc biệt hữu ích: thực tế không có gì hoặc nó được sử dụng cho các nhiệm vụ hoàn toàn khác.

WEB AMI - loại quái vật nào?

Thêm một tùy chọn đã bỏ qua nộp người quản lý.conf cung cấp quyền truy cập đầy đủ vào quản lý ATS thông qua web. Tất cả các lệnh có sẵn thông qua AMI thông thường hiện có trên web, bạn có thể nghe các sự kiện từ PBX thông qua ổ cắm. Nguyên lý hoạt động không khác gì so với console AMI. Sau khi kích hoạt tùy chọn này, bạn có thể liên hệ với tổng đài theo các địa chỉ sau:

https://ats:8089/manager — một trang web có giao diện đơn giản để kiểm tra và gửi yêu cầu theo cách thủ công. Tất cả các phản hồi được định dạng thành HTML có thể đọc được. Không thích hợp lắm để theo dõi.
https://ats:8089/rawman - chỉ xuất văn bản, định dạng tương tự như bảng điều khiển AMI
https://ats:8089/mxml - chỉ xuất văn bản, ở định dạng XML. Phù hợp với chúng tôi!

Cách kết nối Zabbix với Asterisk ngay lập tức

Sau đó tôi nghĩ: “Đây là giải pháp! Bây giờ mọi thứ sẽ sẵn sàng! Nước chanh dễ chảy nước,” nhưng còn quá sớm để vui mừng. Để có được thông tin chúng tôi cần, việc sử dụng yêu cầu GET với hành động cần thiết là đủ hoạt động, phản hồi này trả về xml kèm theo danh sách tất cả các đăng ký và trạng thái của chúng. Điều này thật tuyệt vời, nhưng bạn cần có quyền để ghi nhớ phiên từ cookie. Khi bạn kiểm tra trên trình duyệt, bạn không nghĩ về quá trình này.

quy trình ủy quyền

Đầu tiên chúng ta giải quyết địa chỉ http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, để đáp lại, máy chủ sẽ gửi cho chúng tôi một cookie có phiên ủy quyền. Đây là giao diện của một yêu cầu 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

Câu trả lời:

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>

Để làm việc ở đó bạn cần biệt thự_id="6f5de42c", tức là chính cookie ủy quyền.
Nội dung bạn chỉ cần kiểm tra câu trả lời"Đã chấp nhận xác thực" Tiếp theo, đối với tất cả các cuộc gọi đến máy chủ PBX, chúng tôi sẽ cần thêm cookie ủy quyền vào yêu cầu.

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

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

Đọc cách nhận cookie ủy quyền và sử dụng nó trong các yêu cầu khác tại đây: “Zabbix - mở rộng ranh giới vĩ mô»

Để tạo các phần tử theo dõi trong Zabbix, tôi sẽ sử dụng tính năng tự động phát hiện.

Tự động phát hiện

Để tự động phát hiện đăng ký và theo dõi trạng thái ngang hàng, bạn cần liên hệ theo địa chỉ sau: https://ats:8089/mxml?action=SIPshowregistry hoặc https://ats:8089/mxml?action=SIPpeers

Đáp lại, PBX trả về cho chúng tôi phản hồi 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>

Có rất nhiều rác trong phản hồi, vì vậy trong quá trình tiền xử lý, chúng tôi lọc nó theo mẫu Xpath: //phản hồi/chung[@host]
Sau đó cuộc vui bắt đầu. Để hoạt động với tính năng phát hiện và tạo động các phần tử, phản hồi phải ở định dạng JSON. XML không được hỗ trợ để phát hiện tự động.

Để chuyển đổi XML thành JSON, tôi phải thử một chút với tính năng tự động thay thế, nhờ đó tôi đã tạo một tập lệnh trong JS

Cách kết nối Zabbix với Asterisk ngay lập tức

Một điểm thú vị: trong phản hồi ATS, tất cả các tham số được bao quanh bởi dấu ngoặc đơn và sau khi áp dụng mẫu //phản hồi/chung[@host] chúng được thay thế bằng những cái kép.

Để tạo các phần tử, chúng tôi sử dụng các biến từ phản hồi XML (nay là JSON).

Cách kết nối Zabbix với Asterisk ngay lập tức

Cơ quan đăng ký SIP

Để đăng ký ngụm, chúng tôi sử dụng ba biến: tên truy nhập, chủ nhà, cổng. Tôi hài lòng với tên của nguyên tố [email được bảo vệ]: 5060, Tôi chưa tìm thấy tình huống nào mà bạn cần sử dụng cả năm biến.

Yếu tố chính nhận thông tin về tất cả các đăng ký, Dấu hoa thị - AMI SIPshowregistry. Mỗi phút một lần nó đưa ra yêu cầu GET tới https://ats:8089/mxml?action=SIPshowregistry, sau đó dữ liệu XML phản hồi được chuyển đến tất cả các phần tử phụ thuộc để phân tích cú pháp. Đối với mỗi đăng ký, tôi tạo một phần tử phụ thuộc vào nó. Điều này thuận tiện vì chúng tôi nhận được thông tin cập nhật trong một yêu cầu chứ không phải cho từng yêu cầu riêng biệt. Việc triển khai này có một nhược điểm đáng kể - tải cho bộ xử lý.

Khi kiểm tra tới 100 phần tử phụ thuộc, tôi không nhận thấy tải, nhưng với 1700 phần tử, điều này mang lại mức tải đáng chú ý là 15 giây trên bộ xử lý. Hãy ghi nhớ điều này nếu bạn có một số lượng lớn các yếu tố phụ thuộc.

Là một tùy chọn để “trải rộng” tải hoặc đặt các tần số bỏ phiếu khác nhau cho một phần tử, bạn có thể di chuyển logic xử lý sang từng phần tử riêng biệt.

Tôi không lưu trữ thông tin nhận được trong phần tử chính. Thứ nhất, tôi không thấy cần thiết phải làm điều này và thứ hai, nếu phản hồi lớn hơn 64K thì Zabbix sẽ cắt nó đi.

Vì chúng tôi sử dụng phản hồi XML đầy đủ cho phần tử phụ thuộc nên chúng tôi cần lấy giá trị của phần tử này trong quá trình tiền xử lý. Bởi vì Xpath nó được thực hiện như thế này:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ tình trạng)
Đối với trạng thái đăng ký, tôi không sử dụng trạng thái văn bản mà chuyển đổi chúng thành dạng số bằng JavaScript:

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

SIP ngang hàng

Tương tự như đăng ký SIP, có một thành phần chính của Asterisk - AMI SIPshowregistry, trong đó những thành phần phụ thuộc được thêm vào.

Điều này tạo ra hai yếu tố phụ thuộc:

  • Trạng thái ngang hàng ở dạng văn bản
  • Thời gian phản hồi của thiết bị - nếu trạng thái OK thì thời gian phản hồi của thiết bị sẽ được ghi, nếu không thì “-1”

Đường dẫn đến phần tử đơn giản hơn một chút Xpath:

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

Đối với phần tử thứ hai tôi đã sử dụng JavaScript để phân tách thời gian đáp ứng từ trạng thái ngang hàng, vì chúng được lưu trữ cùng nhau:

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

Kết luận

Một giải pháp sẵn có có thể phức tạp và không rõ ràng ngay lập tức. Tăng tính linh hoạt và tính di động giữa các hệ thống khác nhau

Chúc mọi người hội nhập vui vẻ và dễ dàng! Mẫu và hướng dẫn thiết lập GitHub.

Nguồn: www.habr.com

Thêm một lời nhận xét