• 沒有找到結果。

自動事件偵測與組態管理

在文檔中 ITIL 事件管理自動化研究 (頁 63-69)

4.1 系統實作成果

4.1.2 自動事件偵測與組態管理

因功能或應用軟體的限制,一般的企業 IT 服務皆非全然為單一作業 系統環境,故事件偵測程式必須能夠處理各種系統平台,而一般常用 的伺服器作業系統為 IBM AIX、HP-UX、Linux 與 Windows 等。本研 究自動事件偵測與組態管理之運作流程如圖 19 所示。

圖 19 自動事件偵測與組態管理流程 資料來源:本研究

如圖 19,自動事件偵測步驟為:

1. 透過事件偵測程式,依排程定期偵測事件。

2. 偵測到異常事件後,將事件訊息傳送到事件關聯伺服器,儲 存至事件訊息檔案。

而組態管理運作步驟為:

1. 透過組態管理程式,依排程定期收集組態資料,並存放至組

態管理資料庫中。

ChkCpuUsage.pl 偵測伺服器 CPU 使用狀況是否有超過設定標 準值。

ChkDiskQuota.pl 偵測伺服器 DISK 使用是否在安全的臨界值。

ChkFileCount.pl 偵測目錄中的檔案總數,是否超過設定臨界 值。

ChkOracleAPLog.pl 檢查 Oracle ERP AP 的 errorlog 內容,取得有

“error”的訊息資訊。

ChkOracleDBLog.pl 檢查 Oracle database 的 alertlog 內容,取得有

“ORA-” 錯誤訊息的資訊。

ChkOsEvent.pl 檢查 Windows 伺服器的 eventlog 內容,取得類 型為“錯誤”的訊息資訊。

ChkOsMessages.pl 檢查 UNIX 伺服器的 messages log 內容,取得

“Crit、Warning”的訊息。

ChkPingServer.pl 利用 ping 伺服器方式,偵測伺服器回應狀態。

ChkProcess.pl 偵測各種重要的 Process 是否存在於 UNIX 系 統中,如 Oracle 資料庫的 ora_smon process。

ChkService.pl 偵測 Windows 伺服器中的重要的服務狀態是 否正常,如 MSSQL 資料庫的服務狀態必須為

“啟動”狀態。

ChkMssqlLog.pl 檢查 MSSQL database 的 errorlog 內容,取得“錯 誤”或“error”訊息內容資訊。

ChkWebStatus.pl 偵測網頁的資料回應內容,確認 Web-based 系

程式名稱 程式功能說明

CmChangeAudit.pl 比對各新、舊組態資料內容,若有異動則記錄 至組態異動資料表中,並保存組態異動資訊內

CmOracleDB.pl 取得 Oracle 資料庫的組態資料,如資料庫參數 與設定值。

CmUnixOS.pl 取得 UNIX 伺服器上,包含 CPU、記憶體、磁 碟、作業系統版本與 Kernel 參數設定值等等組 態資料。

CmService.pl 取得 Windows 伺服器上的所有服務資料與其 設定值,如啟動模式與登入帳號等等。

CmWindowsOS.pl 取得 Windows 伺服器上,包含 CPU、記憶體、

磁碟、作業系統版本等組態資料。

$avg_cpu_usage 乃取得平均的 CPU 使用率,若超過設定上線便執行 寫出訊息的副程式,第二十一行至第三十一行副程式是將事件訊息,

傳遞到事件伺服器的網路埠(Port)20097,由事件伺服器接收處理。本 研究建構了 EventStoreListener.pl 程式在事件伺服器上,用來接收所 有程式所傳遞的事件訊息,EventStoreListener.pl 使用網路埠(Port) 20097 來接收資料,再將收到的事件訊息資料存至檔案,由事件關聯 進行後續的事件關聯處理。

表 9 ChkCpuUsage.pl 程式內容

use Win32::OLE qw(in with);

my $host= $ARGV[0];

my $threshold= $ARGV[1];

$WMI = Win32::OLE->new('WbemScripting.SWbemLocator');

$Services = $WMI->ConnectServer($host);

$processor_set = $Services->InstancesOf("Win32_Processor");

$proc_count=0;

$total_proc_perf=0;

foreach $proc (in($processor_set)) {

$proc_perf = $proc->{'LoadPercentage'};

$proc_count =$proc_count+1;

$total_proc_perf=$total_proc_perf+$proc_perf;

}

$avg_cpu_usage=int($total_proc_perf/$proc_count);

if ($avg_cpu_usage > $threshold) {

&write_msg();

}

sub write_msg { use IO::Socket::INET;

my $MySocket=new IO::Socket::INET->new(PeerPort=>20097, Proto=> 'udp',PeerAddr=>'192.168.2.222');

my $passstr;

my ($sec,$min,$hour,$day,$mon,$year,$wday) = localtime;

$year +=1900;

$mon +=1;

my $logmoddate="$year/$mon/$day $hour:$min:$sec";

$passstr="$logmoddate|$host|OS|CPU|OVER THRESHOLD

$threshold\% ,CURRENT USAGE IS $avg_cpu_usage\%";

$MySocket->send($passstr);

}

資料來源:本研究

組態收集程式會定期執行收集組態設定資訊,以收集 MSSQL 資 料庫參數與設定值的 CmMssql.pl 程式為例,詳細內容如表 10 所示,

其中第一行為欲收集組態資料的資料庫伺服器 IP,第二行為管理者名

稱,第四行到第六行是用 ADODB 建立與本研究中 MySQL 組態資料 庫的連線,第七行到第九行是建立欲收集組態資料的 MSSQL 資料庫 連線,第十六行到二十一行是執行 MSSQL 上的 sp_configure 預存程 序,取得 MSSQL 整體資料庫於伺服器上的組態設定值,第二十二到 第三十一行是將執行 sp_configure 所取得組態資料,交給 insert_data 副程式進行將資料存入 MySQL 組態資料庫動作,第三十二行到第三 十七行是透過 MSSQL 的系統表 sysdatabases,取得在此資料庫伺服 器的所有資料庫清單,第三十八到第五十八行是將所取得的資料庫清 單,依序執行 sp_dboption 預存程序獲取各資料庫有啟動的資料庫組 態設定值,第六十行到第七十二行是 insert_data 副程式內容,用來將 取得的組態資料存入組態資料庫。

my $admin= $ARGV[1];

use Win32::OLE;

my $connCMDBstr="DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.168.2.222; PORT=3306;DATABASE=sec;

USER=root; PASSWORD=; OPTION=3;";

my $connCMDB = Win32::OLE-> new('ADODB.connection');

$connCMDB-> Open($connCMDBstr);

my $connstr="driver={SQL Server};server=$host;AutoTranslate=

No;Trusted_connection=yes;Network=dbnmpntw;Database=master

;";

my $conn = Win32::OLE-> new('ADODB.connection');

$conn-> Open($connstr);

my $err = Win32::OLE::LastError();

if (not $err eq "0") {

print"FATAL: no connection, OLE error : $err\n";

exit;

}

my $server_cfg = "sp_configure";

if(! ($rsserver = $conn->Execute($server_cfg)))

18

print Win32::OLE->LastError();

exit;

}

while (! $rsserver->EOF) {

$object_type="DATABASE";

$object_category="SQLSERVERDB";

$object_name="SYSTEM_CONFIG";

$configure_name= $rsserver->Fields('name')->value;

$configure_value= $rsserver->Fields('run_value')->value;

&insert_data($object_type,$object_category,$object_name,$co nfigure_name,$configure_value);

$rsserver->MoveNext;

}

my $serverlist="select * from sysdatabases";

if(! ($rsdblist = $conn->Execute($serverlist))) {

print Win32::OLE->LastError();

exit;

}

while (! $rsdblist->EOF) {

my $dbname=$rsdblist->Fields('name')->value;

my $dboption="sp_dboption $dbname";

if(! ($rsdboption = $conn->Execute($dboption))) {

print Win32::OLE->LastError();

exit;

}

while (! $rsdboption->EOF) {

$object_type="DATABASE";

$object_category="SQLSERVERDB";

$object_name=$dbname;

$configure_name= $rsdboption->Fields(0)->value;

$configure_value="ON";

&insert_data($object_type,$object_category,$object_name,$config ure_name,$configure_value);

$rsdboption->MoveNext;

}

$rsdblist->MoveNext;

59

sub insert_data {

my $object_type=shift;

my $object_category=shift;

my $object_name=shift;

my $configure_name=shift;

my $configure_value=shift;

my $insertstr="insert into new_mo_config(host_ip,administrator, object_type,object_category,object_name,config_name,config_valu e) values('" . $host . "','" . $admin . "','" . $object_type . "','" .

$object_category . "','" . $object_name . "','" . $configure_name .

"','" . $configure_value . "')";

if(! $connCMDB->Execute($insertstr)) {

print Win32::OLE->LastError();

exit;

在文檔中 ITIL 事件管理自動化研究 (頁 63-69)