320 likes | 573 Views
Cacti 第三天課程. Cacti 到底是什麼? ( 上午 ) Cacti 的資料流 - Cacti 資料的取得 : Data input methods (Lab 1 & 2 ) Data queries ( Lab 3) - Cacti 資料的儲存 - Cacti 資料的呈現 Cacti 的 plugin ( 下午 ) - Cacti Plugin Architecture ( Lab 4 ) - 如何寫一個 plugin.
E N D
Cacti 第三天課程 • Cacti 到底是什麼? (上午 ) • Cacti 的資料流 • - Cacti 資料的取得 : • Data input methods (Lab 1 & 2 ) • Data queries ( Lab 3) • - Cacti 資料的儲存 • - Cacti 資料的呈現 • Cacti 的 plugin (下午) • - Cacti Plugin Architecture ( Lab 4 ) • - 如何寫一個 plugin
Cacti 到底是什麼? 好用、好操作的進階版 MRTG ? 整合RRD、SNMP、Mysql的軟體? 免費的網管軟體? 免費的反而有可能是最貴的 ?
它是一個具有收集資料、處理資料、儲存資料,且具有繪圖能力的平台它是一個具有收集資料、處理資料、儲存資料,且具有繪圖能力的平台 強大的polling 能力(可以執行自訂的程式碼) 稍作客制化後可主動 push 資料( Agent) 可監控任何型態的資料,不限定網路設備 ex: 監控 mail 有沒有延遲 , 監控VM ,流量分析 只要收得到資料,它就可以繪圖 Plugin提供運用的深度 Cacti 是
最源頭是由 crontab的 poller.php所發動的 Poller.php 到mysql裡將 poller_cache裡的 polling command 逐條執行 Poller cache 是由 Device 裡的定義產生的 Device 一定要有 IP 嗎? 可以是Mail inbox嗎? Poller.php 可設定多個 thread 增快polling速度 Console->Settings->Poller 資料的取得
資料的取得 SNMP Query SNMP OID : 單一的 OID 值,取得單一的值 SNMP Index : 取得SNMP的 Script Query : 用寫好的Shell Script透過rsh或ssh方式,將監控設備的資料取回 。 - Perl 、Java 、WMI PHP 的 Extension : SOAP
資料的取得 眾多的採集資料方式,須遵照Cacti的兩種資料導入方法。(Cacti 官網說明) Data Input Methods : allow Cacti to retrieve data to insert into data sources and ultimately put on a graph. There are different ways for Cacti to retrieve data, the most popular being through an external script or from SNMP Data Query : Data queries are not a replacement for data input methods in Cacti. Instead they provide an easy way to query, or list data based upon an index, making the data easier to graph
資料取得方式 • Data Input Methods : • Wirte a script • Create a Data Input Method • Create or choose a Data Template • Create or choose a Graph Template • Data Query • Wirte a script • Wirte a XML file • Create a Data Input Method • Create or choose a Data Template • Create or choose a Graph Template
資料取得方式- Data Input Methods • 資料是不具index概念的,即1 對 1的結構 • 一次可抓取一到多個資料,回傳多筆須照格式 • var1:value1 var2:value2 ….varN:valueN • 擴展性問題 : 日後若要再多抓一個欄位,須整個 • Data Source 重建 • 若是遠端抓取資料,可減少網路往返的 traffic
資料取得方式- Data Queries • 資料是具index概念的,即1 對 多的結構 • 一次只抓取一個資料,由於資料有次序的特性, • 所以poller在Polling時,是將index做為參數帶入 • Shell script,因此Shell script 一次只會回傳一個 • index對應取得的值。 • 擴展性問題 : 日後若Device多了一個介面或 • mount point,無須整個Data Source 重建 • 若是遠端抓取資料,會增加網路往返的 traffic • Polling 次數增加 會有 Performace Issue
資料的取得 Reindex :當資料對應的index 與最初設定不一樣時 ,例如:router 的 module 更換或移動位置
資料的儲存 經由資料取得的資料,須要放在資料庫;讓資料處理的工具作進一步處理 Cacti 會先將資料放在 mysql -poller_output table 中 有註冊與poller.php hook 的Plugins會先到poller_output 抓資料做處理 最後會寫到 RRD 中
資料的呈現 • Cacti 依據 Device 中所套用的 Graph template中所定的條件,由rrdtool 將圖繪 出來 RRDTool Command: /usr/bin/rrdtool graph - \ --imgformat=PNG \ --start=-86400 \ --end=-300 \ --title='Localhost - Load Average' \ --rigid \ --base=1000 \ --height=120 \ --width=500 \ --alt-autoscale-max \ --lower-limit=0 \ --units-exponent='0' \ --vertical-label='processes in the run queue' \ --slope-mode \ --font TITLE:12: \ --font AXIS:8: \ --font LEGEND:10: \ --font UNIT:8: \ DEF:a="/var/www/cacti/rra/localhost_load_1min_5.rrd":load_1min:AVERAGE \ DEF:b="/var/www/cacti/rra/localhost_load_1min_5.rrd":load_5min:AVERAGE \ DEF:c="/var/www/cacti/rra/localhost_load_1min_5.rrd":load_15min:AVERAGE \
資料的取得 – 實作 • 以Data Input Methods 方式,寫一個隨機 產生1個數值的 bash script ,交由Cacti儲 存到 rrd中,最後由 rrdtool根據 graph template 出圖 ( Lab 1 ) • 同上,但一次產生兩個數值 ( Lab 2 )
資料的取得 -實作 2 • 以Data queries 方式 ,監控本機的 service • ( Lab 4 ) • 需用到基本的 XML 語法 • 做完此 Lab 說明 XML 檔如何運作
Cacti 的 plugin • 剛安裝好的 Cacti 是沒有 Plugin 架構的 • 如果要安裝額外的 Plugin 需要安裝 PA • 例如: cacti_autoinstall_v0.40c.sh • Plugin 是為了擴展 Cacti 的功能 - 例如 : weathermap , 利用收集到的data source 做一個 total view 的展現 • Plugin 彌補Cacti 所沒有的功能 - 例如 : Syslog , Threshold …
Cacti Plugin Architecture • 要裝 Plugin 之前,須先確定有安裝 Plugin Architecture • 什麼是 Plugin Architecture ?有什麼用處? 沒有 Plugin Architecture 可以嗎(陽春版)? • PA 是一種選擇性的延伸檔案集,可以擴展Cacti的基本功能;並且能夠呼叫額外的功能及程式(也就是plugins) • 所以一個 plugin 必須符合 PA 的要求;如此可以不必動到 Cacti 的核心程式
確認PA 的版本 • 由 Console -> Plugin Management • 由 putty login 到 Cacti 檢查是否有 /var/www/cacti/plugins 目錄
PA 的用處 • 可以安裝別人寫的 plugin • 是 Cacti 的 API • 可以開發自己的Plugin
Cacti Plugin 檔案架構 • 一個 plugin 的檔案架構如下: My_plugin/ docs/ CHANGELOG images/ mylogo.png (tab .jpg檔) html/ LICENSE README index.php setup.php (plugin 的安裝檔) myplugin.php (主程式)
內容 : <?php header("Location:../index.php"); ?> 將 plugin的首頁header 交由上一層處理, 上一層即是 PA 架構的index.php PA強制所有plugin 都導回 Cacti的首頁處理 Cacti Plugin 檔案架構 index.php
必要的function 有 plugin_xxx_version() : 顯示版本、作者 xxx_config_arrays() : 註冊 realm ID xxx_draw_navigation_text() : 設定navigation xxx_show_tab() : 設定 tab .gif file plugin_xxx_install() : 安裝後要啟動的功能 plugin_xxx_uninstall() : 解除安裝時的動作 Cacti Plugin 檔案架構 setup.php
Plugin Setup.php function說明 plugin_xxx_version() { return array( ‘name’ => ‘myPlugin’, //plugin名稱 ‘version’ => ‘0.1’, //版本 'longname' => 'My first plugin', ‘author’ => ‘Zest Yang’, //作者 'homepage' => 'http://www.yuanta.com.tw', 'email' => 'zestyang@yuanta.com', 'url' => 'http://www.yuanta.com.tw' ); }
Plugin Setup.php function說明 • xxx_config_arrays(){ • global $user_auth_realm_filenames,$user_auth_realms,$menu; • $realm_id=888; //註冊myPlugin realm id 為888 • $user_auth_realms[$realm_id]='My Plugin Test'; • $user_auth_realm_filenames['myPlugin.php'] = $realm_id; • // $user_auth_realm_filenames[‘mySetting.php'] = $realm_id+1; • $menu[‘My Plugins']['plugins/myPlugin/mySetting.php']=‘My Setting'; • } • 可查詢mysql中的 user_auth_realm table 找出目 前登記的realm id • $menu 是global 變數 : global_arrays.php • Menu分為 menu header & menu item
Plugin Setup.php function說明 xxx_draw_navigation_text(){ //左邊 Menu的 navigation $nav["mySetting.php:"] = array("title" => "My Plugin Settings", "mapping" => "index.php:", "url" => "mySetting.php", "level" => "1"); //上面 tab 的 navigation $nav["myPlugin.php:"] = array("title" => "My Plugin", "mapping" => "index.php:", "url" => "myPlugin.php", "level" => "1"); return $nav }
Plugin Setup.php function說明 xxx_show_tab(){ global $config; if (api_user_realm_auth('myPlugin.php')) { if (substr_count($_SERVER["REQUEST_URI"], "myPlugin.php")) { print '<a href="' . $config['url_path'] . 'plugins/myPlugin/myPlugin.php"><imgsrc="' . $config['url_path'] . 'plugins/myPlugin/images/tab_myPlugin_down.gif" alt="myPlugin" align="absmiddle" border="0"></a>'; }else{ print '<a href="' . $config['url_path'] . 'plugins/myPlugin/myPlugin.php"><imgsrc="' . $config['url_path'] . 'plugins/myPlugin/images/tab_myPlugin.gif" alt="myPlugin" align="absmiddle" border="0"></a>'; } } }
Plugin Setup.php function說明 plugin_xxx_install(){ api_plugin_register_hook('myPlugin', 'top_header_tabs', 'myPlugin_show_tab', "setup.php"); api_plugin_register_hook('myPlugin', 'top_graph_header_tabs', 'myPlugin_show_tab', 'setup.php'); api_plugin_register_hook('myPlugin', 'draw_navigation_text', 'myPlugin_draw_navigation_text', 'setup.php'); api_plugin_register_hook('myPlugin', 'config_arrays', 'myPlugin_config_arrays','setup.php'); } 設定此plugin會被安裝的功能
Plugin Setup.php function說明 plugin_xxx_uninstall(){ //設定 Cacti 在uninstall 時,順便也要移除的動作 //例如 : 若此 plugin有 在 mysql Data Base create table // 就可寫在這裡順便做移除 }
Plugin myPlugin.php 說明 <?php chdir('../../'); include_once(‘./include/auth.php’); //檢查該plugin是否有註冊 include_once('./plugins/myPlugin/general_header.php'); //顯示下面這一段 print " Here is your stage !! Have a go hero !!"; ?>
Cacti Plugin實作 - Lab 4 • 此實作會做出自訂的Plugin • 完成plugin後,可由 Console -> Configuration • ->Plugin Management 執行安裝 plugin動作