CACTI DAY3 講義

Download Report

Transcript CACTI DAY3 講義




Cacti 到底是什麼? (上午 )
Cacti 的資料流
- Cacti 資料的取得 :
Data input methods (Lab 1 & 2 )
Data queries ( Lab 3)
- Cacti 資料的儲存
- Cacti 資料的呈現
Cacti 的 plugin (下午)
- Cacti Plugin Architecture ( Lab 4 )
- 如何寫一個 plugin




好用、好操作的進階版 MRTG ?
整合RRD、SNMP、Mysql的軟體?
免費的網管軟體?
免費的反而有可能是最貴的 ?
Cacti 是






它是一個具有收集資料、處理資料、儲存資料,且
具有繪圖能力的平台
強大的polling 能力(可以執行自訂的程式碼)
稍作客制化後可主動 push 資料( Agent)
可監控任何型態的資料,不限定網路設備
ex: 監控 mail 有沒有延遲 , 監控VM ,流量分析
只要收得到資料,它就可以繪圖
Plugin 提供運用的深度




最源頭是由 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 Method
3.Create or choose a Data Template
4.Create or choose a Graph Template
 Data Query
1.Wirte a script
2.Wirte a XML file
3.Create a Data Input Method
4.Create or choose a Data Template
5.Create or choose a Graph Template
 資料是不具index概念的,即1 對 1的結構
 一次可抓取一到多個資料,回傳多筆須照格式
var1:value1 var2:value2 ….varN:valueN
 擴展性問題 : 日後若要再多抓一個欄位,須整個
Data Source 重建
 若是遠端抓取資料,可減少網路往返的 traffic
 資料是具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 )
資料的取得 -實作 2
 以Data queries 方式 ,監控本機的 service
( Lab 4 )
 需用到基本的 XML 語法
 做完此 Lab 說明 XML 檔如何運作
 剛安裝好的 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 的核心程式


由 Console -> Plugin Management
由 putty login 到 Cacti
檢查是否有 /var/www/cacti/plugins 目錄



可以安裝別人寫的 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 (主程式)
Cacti Plugin 檔案架構 index.php



內容 :
<?php
header("Location:../index.php");
?>
將 plugin的首頁header 交由上一層處理,
上一層即是 PA 架構的index.php
PA強制所有plugin 都導回 Cacti的首頁處理
Cacti Plugin 檔案架構 setup.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() : 解除安裝時的動作
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'
=> '[email protected]',
'url'
=> 'http://www.yuanta.com.tw'
);
}
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

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
}
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_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_xxx_uninstall(){
//設定 Cacti 在uninstall 時,順便也要移除的動作
//例如 : 若此 plugin 有 在 mysql Data Base create table
//
就可寫在這裡順便做移除
}
<?php
chdir('../../');
include_once(‘./include/auth.php’); //檢查該plugin是否有註冊
include_once('./plugins/myPlugin/general_header.php');
//顯示下面這一段
print " Here is your stage !! Have a go hero !!";
?>


此實作會做出自訂的Plugin
完成plugin 後,可由 Console -> Configuration
->Plugin Management 執行安裝 plugin 動作