在上一篇文章中 我告訴您如何接收授權會話並將其替換為本機主機巨集。 在這篇文章中,我將告訴您如何在沒有外部腳本和軟體的情況下將 Zabbix 與 Asterisk 連接。
讓這兩個系統「交朋友」的想法很久以前就誕生了,無需安裝額外的軟體或腳本。 快速谷歌搜尋產生了許多可能的解決方案,這一切都歸結為將腳本(Pyha、Bash、Python 等)上傳到伺服器,您會很高興。 我想實現「開箱即用」的監控 - 無需外部腳本,也無需在具有監控和 PBX 的伺服器上安裝其他軟體。
我總共花了4個工作天來完成這個任務,但結果是值得的。 透過 AMI 介面、低階偵測、觸發器以及最重要的是連接 PBX 和所有其他設置,現在大約需要 15 分鐘。
Zabbix 4.4已經可用,Asterisk版本100大約有13個。 有些 PBX 附帶 FreePBX Web 介面,有些帶有裸控制台、一堆技巧並透過撥號方案進行整合。
從 PBX 接收數據
需要解決的第一個也是重點是取得有關對等點和 SIP 註冊的資料。 為此,PBX 具有 AGI、AMI、ARI 和 SSH 控制台介面。 由於顯而易見的原因,我沒有考慮額外的模組。
首先我們要先弄清楚這些agi、ami、ari是什麼......
- AGI - 在撥號方案中使用腳本。 主要用於通話管理。
- AMI - 可以提供所有必要的信息,透過連接埠 5038 工作,類似於 Telnet。 適合我們!
- ARI——現代、時尚、JSON。 有很多可能性,資料格式對於 Zabbix 來說是可以理解的,但對我來說沒有主要的事情:你無法控制 sip 註冊。 另一個缺點是,對於同行來說,只有在線/離線兩種狀態,儘管狀態有更多,並且在診斷時將它們考慮在內是有用的。
- SSH 可以做所有事情,但有時由於「安全原因」而不允許使用。 考慮的因素可能不同,我就不多說了。
然而,儘管有種種缺點,ARI 仍能滿足 90% 的監控需求。
Zabbix 和 Telnet - 我的失望
我很了解 AMI;有一次,我透過遠端辦公室、呼叫管理等實現了與部門對話中的遺失追蹤。 使用 Telnet,一切都非常清晰:打開連接、發送命令並讀取回應。 我就是這麼做的,但結果卻令我失望。
Zabbix 的 Telnet 與控制台的 Telnet 不同。 Linux它稍微簡單一些,專為標準的登入名稱/密碼驗證而設計。如果驗證邏輯不同,且未要求登入名稱/密碼對,則會發生錯誤。在嘗試繞過驗證要求失敗後,我開始研究 Telnet 模組的原始程式碼。
我意識到,除非有傳統的登入和密碼請求,否則我不會繼續前進。 只是為了好玩,我從程式碼中刪除了與授權相關的所有內容並重新組裝了所有內容。 作品! 但它不符合要求。 前進…
讓我們回到搜索
我再次重新閱讀了 ARI 文檔,運行了額外的測試 - 這裡沒有 sip 註冊。 有宴會,有談話,有馬褲,但沒有登記。 有時我甚至想,我們真的需要 SIP 註冊嗎?
有趣的是,此時用戶收到了另一個請求,但出局電話出現了問題。 問題是 sip 註冊被凍結,只需重新啟動模組即可解決。
asterisk -rx "sip reload"如果能夠透過網路存取 AMI,那就太棒了:我想,這將解決所有問題。 我開始朝這個方向挖掘,從字面上看,第一條搜尋線通往官方 Asterisk 文檔,該文檔說我的任務有一個選項 網路功能 在文件中 /etc/asterisk/manager.conf,需要在部分中設定為 YES [一般的]
之後,透過表單的常規網路請求 我們得到了所有必要的資訊。
使用 FreePBX 介面時,您無法透過 Web 啟用此選項;您需要透過控制台變更 manager.conf 檔案來啟用它。 當透過網路進行設定變更時,FreePBX 不會刪除它。
我已經使用各種類型的 Asterisk 整合工作了很長時間,但我從未在任何地方看到過這個功能。 令我驚訝的是,沒有人描述這種與 PBX 互動的方法。 查找有關該主題的資訊甚至特別有用:幾乎沒有任何信息,或者它用於完全不同的任務。
WEB AMI - 什麼樣的野獸?
新增一個選項 網路功能 歸檔 管理器設定檔 提供透過網路對 ATS 管理的完全存取。 透過常規 AMI 可用的所有指令現在都在網路上,您可以透過套接字偵聽來自 PBX 的事件。 操作原理與控制台AMI沒有什麼不同。 啟動此選項後,您可以透過以下位址聯絡 PBX:
— 具有簡單介面的網頁,用於測試和手動發送請求。 所有回應都被格式化為可讀的 HTML。 不太適合監控。
— 僅文字輸出,格式類似控制台 AMI
- 僅文字輸出,採用 XML 格式。 適合我們!

然後我想:「這就是解決辦法! 現在一切都準備好了! 容易尿尿的檸檬汁”,但現在高興還為時過早。 要獲取我們需要的信息,使用 GET 請求和必要的操作就足夠了 行動,作為回應傳回 xml,其中包含所有註冊及其狀態的清單。 這一切都很棒,但是您需要授權才能記住 cookie 中的會話。 當你在瀏覽器中測試時,你不會考慮這個過程。
授權流程
首先我們解決地址 ,作為回應,伺服器向我們發送一個帶有授權會話的 cookie。 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”,即授權 cookie 本身。
您只需檢查內容即可找到答案”認證已接受」 接下來,對於對 PBX 伺服器的所有調用,我們需要向請求添加授權 cookie。
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"請閱讀如何取得授權 cookie 並在其他請求中使用它:“»
為了在 Zabbix 中創建追蹤元素,我將使用自動檢測。
自動偵測
要自動偵測註冊並追蹤對等狀態,您需要聯絡以下地址: 或
作為回應,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> 回應中存在大量垃圾,因此在預處理時我們透過模板進行過濾 路徑: //回應/通用[@host]
然後樂趣就開始了。 若要使用偵測並動態建立元素,回應必須採用 JSON 格式。 自動偵測不支援 XML。
要將 XML 轉換為 JSON,我必須使用自動替換,為此我用 JS 編寫了一個腳本

有趣的一點:在ATS回應中,所有參數都用單引號括起來,並且在應用模板之後 //回應/通用[@host] 它們被雙倍取代。
為了建立元素,我們使用 XML 回應(現在是 JSON)中的變數。

SIP 註冊
對於 sip 註冊,我們使用三個變數: 用戶名, 主持人, 端口。 我對元素的名稱很滿意 111111@login.mtt.ru:5060,我還沒有發現任何需要使用全部五個變數的情況。
接收有關所有註冊資訊的主要元素, Asterisk - AMI SIPshowregistry。 它每分鐘發出一次 GET 請求 ,之後回應 XML 資料將傳遞到所有依賴元素進行解析。 對於每個註冊,我都會建立一個依賴它的元素。 這很方便,因為我們會在一個請求中收到最新訊息,而不是分別收到每個請求的最新訊息。 這種實作有一個顯著的缺點——處理器的負載。
當測試多達 100 個相關元素時,我沒有註意到負載,但對於 1700 個元素,這會給處理器帶來明顯的 15 秒負載。 如果您有大量依賴元素,請記住這一點。
作為「分散」負載或為元素設定不同輪詢頻率的選項,您可以將處理邏輯分別移動到每個元素。
我不將收到的資訊儲存在主元素中。 首先,我認為沒有必要這樣做,其次,如果回應超過 64K,那麼 Zabbix 就會將其切斷。
由於我們對依賴元素使用完整的 XML 回應,因此我們需要在預處理中取得該元素的值。 透過 路徑 它是這樣完成的:
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”
元素本身的路徑稍微簡單一些 路徑:
string(//回應/通用[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)
對於第二個元素,我使用 JavaScript 來分隔 響應時間 來自對等狀態,因為它們儲存在一起:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}結論
開箱即用的解決方案可能很複雜且不能立即清晰。 提高不同系統之間的靈活性和可移植性
祝大家整合愉快、輕鬆! 模板和設定說明 .
來源: www.habr.com
