Cacti 第三天課程

Preview:

DESCRIPTION

Cacti 第三天課程. Cacti 到底是什麼? ( 上午 ) Cacti 的資料流 - Cacti 資料的取得 : Data input methods (Lab 1 & 2 ) Data queries ( Lab 3) - Cacti 資料的儲存 - Cacti 資料的呈現 Cacti 的 plugin ( 下午 ) - Cacti Plugin Architecture ( Lab 4 ) - 如何寫一個 plugin. - PowerPoint PPT Presentation

Citation preview

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 是

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 :

1.Wirte a script 2.Create a Data Input Method3.Create or choose a Data Template 4.Create or choose a Graph Template

Data Query

1.Wirte a script 2.Wirte a XML file3.Create a Data Input Method4.Create or choose a Data Template 5.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

資料的取得 Data Input

Methods Data Queries

Return Data 1 ~ 多筆 1 筆Index 無 有

Complexity 簡單 複雜Extesibility 固定 可伸展

Implementation

較簡單 較複雜需要 Reindex 不用 視需要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 )

以 Data queries 方式 ,監控本機的 service

( Lab 4 )需用到基本的 XML 語法 做完此 Lab 說明 XML 檔如何運作

資料的取得 -實作 2

Cacti 的 plugin 剛安裝好的 Cacti 是沒有 Plugin 架構的 如果要安裝額外的 Plugin 需要安裝 PA 例如 : cacti_autoinstall_v0.40c.sh

Plugin 是為了擴展 Cacti 的功能 - 例如 : weathermap , 利用收集到的data source 做一個 total view 的展現 Plugin 彌補 Cacti 所沒有的功能 - 例如 : Syslog , Threshold …

要裝 Plugin 之前,須先確定有安裝 Plugin Architecture

什麼是 Plugin Architecture ?有什麼用處? 沒有 Plugin Architecture 可以嗎 ( 陽春版 ) ? PA 是一種選擇性的延伸檔案集,可以擴展 Cacti的基本功能;並且能夠呼叫額外的功能及程式 ( 也就是 plugins) 所以一個 plugin 必須符合 PA 的要求;如此可以不必動到 Cacti 的核心程式

Cacti Plugin Architecture

確認 PA 的版本 由 Console -> Plugin Management

由 putty login 到 Cacti 檢查是否有 /var/www/cacti/plugins 目錄

PA 的用處 可以安裝別人寫的 plugin 是 Cacti 的 API 可以開發自己的 Plugin

一個 plugin 的檔案架構如下:My_plugin/ docs/ CHANGELOG images/ mylogo.png (tab .jpg 檔 ) html/ LICENSE README index.php setup.php (plugin 的安裝檔 ) myplugin.php ( 主程式 )

Cacti Plugin 檔案架構

內容 : <?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"><img src="' . $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"><img src="' . $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 說明<?phpchdir('../../');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 動作