如何開箱即用地將 Zabbix 與 Asterisk 連接

在上一篇文章中 《Zabbix—拓展宏觀邊界》 我告訴您如何接收授權會話並將其替換為本機主機巨集。 在這篇文章中,我將告訴您如何在沒有外部腳本和軟體的情況下將 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 與 Linux 控制台中的不一樣,它更簡單一些,並且是針對登入/密碼等標準授權量身定制的。 如果授權邏輯不同,且沒有請求登入名稱/密碼對,則會發生錯誤。 在嘗試繞過授權要求徒勞之後,查看 Telnet 模組的原始程式碼很有用。

我意識到,除非有傳統的登入和密碼請求,否則我不會繼續前進。 只是為了好玩,我從程式碼中刪除了與授權相關的所有內容並重新組裝了所有內容。 作品! 但它不符合要求。 前進…

讓我們回到搜索

我再次重新閱讀了 ARI 文檔,運行了額外的測試 - 這裡沒有 sip 註冊。 有宴會,有談話,有馬褲,但沒有登記。 有時我甚至想,我們真的需要 SIP 註冊嗎?

有趣的是,此時用戶收到了另一個請求,但出局電話出現了問題。 問題是 sip 註冊被凍結,只需重新啟動模組即可解決。

asterisk -rx "sip reload"

如果能夠透過網路存取 AMI,那就太棒了:我想,這將解決所有問題。 我開始朝這個方向挖掘,從字面上看,第一條搜尋線通往官方 Asterisk 文檔,該文檔說我的任務有一個選項 網路功能 在文件中 /etc/asterisk/manager.conf,需要在部分中設定為 YES [一般的]

之後,透過表單的常規網路請求 http://ats:8089/mxml?action=SIPshowregistry 我們得到了所有必要的資訊。

使用 FreePBX 介面時,您無法透過 Web 啟用此選項;您需要透過控制台變更 manager.conf 檔案來啟用它。 當透過網路進行設定變更時,FreePBX 不會刪除它。

我已經使用各種類型的 Asterisk 整合工作了很長時間,但我從未在任何地方看到過這個功能。 令我驚訝的是,沒有人描述這種與 PBX 互動的方法。 查找有關該主題的資訊甚至特別有用:幾乎沒有任何信息,或者它用於完全不同的任務。

WEB AMI - 什麼樣的野獸?

新增一個選項 網路功能 歸檔 管理器設定檔 提供透過網路對 ATS 管理的完全存取。 透過常規 AMI 可用的所有指令現在都在網路上,您可以透過套接字偵聽來自 PBX 的事件。 操作原理與控制台AMI沒有什麼不同。 啟動此選項後,您可以透過以下位址聯絡 PBX:

https://ats:8089/manager — 具有簡單介面的網頁,用於測試和手動發送請求。 所有回應都被格式化為可讀的 HTML。 不太適合監控。
https://ats:8089/rawman — 僅文字輸出,格式類似控制台 AMI
https://ats:8089/mxml - 僅文字輸出,採用 XML 格式。 適合我們!

如何開箱即用地將 Zabbix 與 Asterisk 連接

然後我想:「這就是解決辦法! 現在一切都準備好了! 容易尿尿的檸檬汁”,但現在高興還為時過早。 要獲取我們需要的信息,使用 GET 請求和必要的操作就足夠了 行動,作為回應傳回 xml,其中包含所有註冊及其狀態的清單。 這一切都很棒,但是您需要授權才能記住 cookie 中的會話。 當你在瀏覽器中測試時,你不會考慮這個過程。

授權流程

首先我們解決地址 http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix,作為回應,伺服器向我們發送一個帶有授權會話的 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 - 擴展宏邊界»

為了在 Zabbix 中創建追蹤元素,我將使用自動檢測。

自動偵測

要自動偵測註冊並追蹤對等狀態,您需要聯絡以下地址: https://ats:8089/mxml?action=SIPshowregistryhttps://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>

回應中存在大量垃圾,因此在預處理時我們透過模板進行過濾 路徑: //回應/通用[@host]
然後樂趣就開始了。 若要使用偵測並動態建立元素,回應必須採用 JSON 格式。 自動偵測不支援 XML。

要將 XML 轉換為 JSON,我必須使用自動替換,為此我用 JS 編寫了一個腳本

如何開箱即用地將 Zabbix 與 Asterisk 連接

有趣的一點:在ATS回應中,所有參數都用單引號括起來,並且在應用模板之後 //回應/通用[@host] 它們被雙倍取代。

為了建立元素,我們使用 XML 回應(現在是 JSON)中的變數。

如何開箱即用地將 Zabbix 與 Asterisk 連接

SIP 註冊

對於 sip 註冊,我們使用三個變數: 用戶名, 主持人, 端口。 我對元素的名稱很滿意 [電子郵件保護]:5060,我還沒有發現任何需要使用全部五個變數的情況。

接收有關所有註冊資訊的主要元素, Asterisk - AMI SIPshowregistry。 它每分鐘發出一次 GET 請求 https://ats:8089/mxml?action=SIPshowregistry,之後回應 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;
}

結論

開箱即用的解決方案可能很複雜且不能立即清晰。 提高不同系統之間的靈活性和可移植性

祝大家整合愉快、輕鬆! 模板和設定說明 GitHub上.

來源: www.habr.com

添加評論