在上一篇文章中
讓這兩個系統「交朋友」的想法很久以前就誕生了,無需安裝額外的軟體或腳本。 快速谷歌搜尋產生了許多可能的解決方案,這一切都歸結為將腳本(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 與 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:
然後我想:「這就是解決辦法! 現在一切都準備好了! 容易尿尿的檸檬汁”,但現在高興還為時過早。 要獲取我們需要的信息,使用 GET 請求和必要的操作就足夠了 行動,作為回應傳回 xml,其中包含所有註冊及其狀態的清單。 這一切都很棒,但是您需要授權才能記住 cookie 中的會話。 當你在瀏覽器中測試時,你不會考慮這個過程。
授權流程
首先我們解決地址
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 註冊,我們使用三個變數: 用戶名, 主持人, 端口。 我對元素的名稱很滿意 [電子郵件保護]:5060,我還沒有發現任何需要使用全部五個變數的情況。
接收有關所有註冊資訊的主要元素, Asterisk - AMI SIPshowregistry。 它每分鐘發出一次 GET 請求
當測試多達 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