第5章 hack NAGIOS-監視command的開發

「第5章 hack NAGIOS-監視command的開發」の編集履歴(バックアップ)一覧はこちら

第5章 hack NAGIOS-監視command的開發」(2006/02/23 (木) 18:37:54) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<p><font size="3"><span lang="EN-US"><font face= "Century">Nagiosplugin</font></span> <span style="font-family: PMingLiU;" lang= "ZH-TW">的開發</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這一章我們要來看如何開發一個</span><span lang= "EN-US"><font face="Century">plagin</font></span><span style= "font-family: PMingLiU;" lang="ZH-TW">。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">在開放原始碼的世界裡,大家都可以寫軟體,大家都可以把自已的作品公開給大家使用。因此,</span><span lang="EN-US"><font face="Century">nagios</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">這個功能特強大的軟體,也已經有非常多的人為它寫了很多好用的</span><span lang="EN-US"><font face="Century">plugin</font></span><span style="font-family: PMingLiU;" lang="ZH-TW">,放在網路上讓大家下載使用。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這些讓大家下載來使用的</span><span lang="EN-US"><font face= "Century">plugin</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">如果寫的太爛,可能不用多久就會受到一些使用者的修改與補強,於是這個軟體就在眾人的努力之下愈變愈好。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">但是即使是如此,有的時候我們還是無法在網路上找到適合我們需求的</span><span lang="EN-US"><font face="Century">piugin</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">,此時我們就必須要自已開發了。依照</span><span lang= "EN-US"><font face="Century">nagios</font></span><span style= "font-family: PMingLiU;" lang="ZH-TW">所列出的</span><span lang= "EN-US"><font face="Century">plung</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">開發守則,一個成功且優良的</span><span lang= "EN-US"><font face="Century">plugin</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">是具有以下的條件的:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">而這個優良的插件的軟體在寫作之時,是必須要遵守以下的條件的:</span></font></p> <ol> <li><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">寫出這個插件的使用方法</span></font><br></li> <li><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這個插件的反回值需要遵守即定的格式</span></font><br></li> <li><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">考慮nagios執行的效能</span></font></li> <li><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">遵守命名規則<br></span></font></li> </ol> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這些條件所規範的,是希望開發出來的插件是個容易被使用,並且不會造成nagios主機太大的負擔。因為nagios主機要負責運行很多的監視,也就是說要執行相當多的插件,當其中的某個插件具有不好的性能時,很容易對其他的服務造成影嚮。一個老鼠壞了一鍋州,就是在說這個意思。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">如果說這個插件是個plain-text,那麼使用者可以直接從原始碼來獲得資訊,如果不是的話,那麼這個插件就有提供這方面資訊的義務了。所以通常nagios插件,都會有help的選項,幫助使用者掌握使用方式。</span></font></p> <p><br></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">筆者當初在從事這個插件的開發之時,也是一直將這規範記在心裡。但是有的時候遇到專案經理的緊急要求,需要在短時間之內開發一個奇特服務的監視插件時,常常就把這些規範給制之於腦後了。</span></font></p> <br> <hr size="2" width="100%"> ● 開始動手吧!<br> <p><font size="3"><span style="font-family: PMingLiU;" lang="ZH-TW"><br> 當然解決任何問題最好的方法,就是找現有的答案。雖然我沒有仔細的調查過,但是我可以百分之一百的確定,所有常用服務的監視插件,都已經存在在這世界上的某一個角落了,所以你只要打開電腦,到</span><span lang="EN-US"><font face="Century">google</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">輸入一些關鍵字,一定可以找的到這些常用服務的監視插件,雖然它不一定是免費的。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">但是一些非常的客制化的服務,比方說你想要為你的客戶開發一個定期監視鳥龍裡的飼料是否以經被鳥吃完了這個特別的服務,可以就必需要自已寫了。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">自已寫插件並不是一件困難的事情,在講這這麼多前言之後,我們就先來展示一個全世界最簡單的</span><span lang="EN-US"><font face="Century">helloworld!</font></span><span style="font-family: PMingLiU;" lang="ZH-TW">級插件:</span></font></p> <table style="width: 495px; height: 49px;" border="1"> <tbody> <tr> <td>#!/bin/sh<br> echo OK- Hello World!<br> <br></td> </tr> </tbody> </table> <font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">夠簡單吧,這是一個</span><span lang="EN-US"><font face= "Century">shell</font></span> <span style="font-family: PMingLiU;" lang= "ZH-TW">指令,它只反回一個</span><span lang="EN-US"><font face= "Century">ok</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">,還有一個訊息</span><span lang="EN-US"><font face= "Century">hello world</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">,它給我們一個觀念,就是只要有反回值,而且<b>反回值是能夠讓nagios所認識的</b>,都可以被當作是插件來使用。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來我們將它安裝到我們的</span><span lang= "EN-US"><font face="Century">nagios</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">上,安裝的步驟不管插件是簡單還是複雜,手續都是一樣的。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">首先我們先定義一個服務,我們可以以下面的方式來進行定義:為了簡化說明,我使用了定義檔的繼承方式(</span></font> <font size="3"><span style="font-family: PMingLiU;" lang="ZH-TW">use generic-service</span></font> <font size="3"><span style= "font-family: PMingLiU;" lang= "ZH-TW">),很多東西都延用共通的設定,只列出我們要修改的部份:(各個文字列中間的空格,是一個半型的space)<br> </span></font></p> <table border="1" height="183" width="543"> <tbody> <tr> <th>services.cfg<br></th> </tr> <tr> <td valign="top">define service {<br> use generic-service<br> <b>host_name mycomputer----------------------------1<br></b><b>service_description hello_world_test------------2</b><br> <b>check_command check_helloworld--------------3</b><br> <b>contact_groups me---------------------------------4</b><br> }</td> </tr> <tr> <td valign="top">說明:<br> <br> <ol> <li> 主機名稱,因為服務必須要存在於主機,所以我們要定義這個項目,這裡的mycomputer,是在hosts.cfg的檔案裡必須要先定義好的。</li> <li> 服務描述:關於這一項service的描述。儘量取可容易一目了然的名字,最好用英文,用中文的話會出現亂碼。</li> <li> 用來監視的命令名:這也是在checkcommand裡必須要先定義好的。</li> <li> 連絡群組:當服務發生問題時要聯絡誰,這也是必須要在contact.cfg裡事先定義好的。</li> </ol> </td> </tr> </tbody> </table> <font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">在完成了以上的設定細節,使用</span></font></p> <table border="1" height="29" width="485"> <tbody> <tr> <td><b>nagios -v /usr/local/nagios/etc/nagios.cfg</b></td> </tr> </tbody> </table> <font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">測式一下設定檔,如果沒有問題,就可以執行</span></font></p> <table border="1" height="29" width="489"> <tbody> <tr> <td><b>/etc/init.d/nagios restart</b><br></td> </tr> </tbody> </table> <font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">來重新啟動</span><span lang="EN-US"><font face= "Century">nagios</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">,過了不久只後,我們就會看到我們的</span><span lang= "EN-US"><font face="Century">nagios</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">出現了如下圖的訊息了。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">當然,這個插件是絕對無法派上任何用場的,不過它就好像單細胞生物一樣至少它是個插件。</span></font></p> <hr size="2" width="100%"> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">在體驗完這個簡單的插件之後,接下來要登場的就是難度比較高一點的插件了。插件可以被任何語言所寫成,只要它是能被執行,並且反回特定格式的訊息,它的內容是</span><span lang="EN-US"><font face="Century">c</font></span><span style="font-family: PMingLiU;" lang="ZH-TW">也好,</span><span lang="EN-US"><font face= "Century">java</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">也好,</span><span lang="EN-US"><font face= "Century">perl</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">也好,都是被允許的。接下來,我們設某一天,專案經理對我們提出了一個要求,希望我們開發出一個定期監視台積電的股價的插件,並且在股價發生變動時,發一封信通知專案經理進場護盤。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接到這一個要求的小明馬上就列出了下面這一個規格書:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">還有也作出了下列的</span><span lang="EN-US"><font face= "Century">uml</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">與專案經理進行確認之後,小明評估了需求之後,決定先使用有很多方便的工具的</span><span lang="EN-US"><font face="Century">java</font></span><span style="font-family: PMingLiU;" lang="ZH-TW">來作書寫。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">在這個部份裡面,我們先針對了一些輸出值,輸入值,以及門檻值,以及安全值作出了設定,因為我們不曉得專案經理對於股價的企圖心在那裡,所以我們把這個設定值空出來讓經裡自行設定,</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">我們將可以進行設定的部份以</span><span lang= "EN-US"><font face="Century">java</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">語言來實作,將會是如以下的部份:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">因為需要接受語多的命令,所以採用了</span><span lang= "EN-US"><font face="Century">common</font></span><span style= "font-family: PMingLiU;" lang="ZH-TW">之下的</span><span lang= "EN-US"><font face="Century">getopt</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">這一個方便精巧的功具:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">程式碼如下所示:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這個工具可以幫助我們產生一些命令行,提示使用者該如何使用命令,以及讀取使用者的命令,非常的方便。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">還有,我們也知道股價的變動是一天不會超過或低於百分之七的,所以如果經裡的設定值,與現在的股價比起來,如果低於這個範圍,那我們就可以使得這一個插件休兵一天,不用一直去查詢網站。而相反的,如果說這一天的股價,很有可能到達這一個設定值,則我們就要希望能夠增加我們訪問這個股價的數量。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">將這一個邏輯以</span><span lang="EN-US"><font face= "Century">java</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">語言來作表示的話,將會是如下的範例:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來是這個程式核心的邏輯部份,也就是我們要從網站上得到股價:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這個時候我們使用的是</span><span lang="EN-US"><font face= "Century">commons</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">程式庫的</span><span lang="EN-US"><font face= "Century">httpclient</font></span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">我們始我下面這一段程式碼來存取網站:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">程式碼將如下所示:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這個程式碼送出一個</span><span lang="EN-US"><font face= "Century">get</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">要求,從</span><span lang="EN-US"><font face= "Century">yahoo</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">網站上得到了台積電網頁。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這一個網頁,裡的第一行是股價,所以我們試著取得網頁上的第一行。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">程式碼如下所示:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">然後這一個股價的位置位於這一行的第三個</span><span lang="EN-US"><font face="Century">TD TAG</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">之間,所以我們利用一個簡單的</span><span lang= "EN-US"><font face="Century">regexp</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">,來取得這一個股價的位置。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">到目前為止,我們已經完成了這一個插件的大半部份,接下來就是將它們組合起來,成為一個完整的程式:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">將這個程式放到</span><span lang="EN-US"><font face= "Century">nagios</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">的</span><span lang="EN-US"><font face= "Century">server</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">上,接著,進行編譯及測式:</span></font></p> <p><span lang="EN-US"><font face="Century"><font size= "3">javacxxxx</font></font></span></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">執行這個程式:</span></font></p> <p><span lang="EN-US"><font face="Century"><font size="3">java –cp xxx xxxxxx</font></font></span></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">結果我們發現這一個結果:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">依照這一個命令所是示的,我們假設我們的股價是</span><span lang="EN-US"><font face="Century">100</font></span><span style="font-family: PMingLiU;" lang="ZH-TW">元,作出以下的設定:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">結果</span><span lang="EN-US"><font face= "Century">nagios</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">反回了這一個結果:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">因為現在台積電的股價還低於設定值,所以</span><span lang="EN-US"><font face="Century">ok</font></span><span style="font-family: PMingLiU;" lang="ZH-TW">。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接著我們假設我們的目標股價是</span><span lang= "EN-US"><font face="Century">50</font></span><span style= "font-family: PMingLiU;" lang="ZH-TW">元</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">出現了下列這一個訊息:</span></font></p> <p><span lang="EN-US"><font face="Century"><font size= "3">critical</font></font></span></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">果然台積電的股價以經有點危險了。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">看來沒什麼問題了。接下來我們將這個</span><span lang= "EN-US"><font face="Century">plugin</font></span><span style= "font-family: PMingLiU;" lang="ZH-TW">安裝到</span><span lang= "EN-US"><font face="Century">nagios</font></span><span style= "font-family: PMingLiU;" lang="ZH-TW">上。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">然後,如果這個股價超過了這一個臨界值之後,通當會超過之後就一直超過,或是超過之後又低回來,當股價超過之後,如果一直不停的發送信息也不是辦法。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">所以我們要對這個細節,來對</span><span lang= "EN-US"><font face="Century">nagios</font></span><span style= "font-family: PMingLiU;" lang="ZH-TW">作出設定:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">設定檔如下所示:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">一切就緒之後,接下來我們打開畫面,出現了以下的場景:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來的問題,如果要將這個</span><span lang= "EN-US"><font face="Century">plug</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">擴充成不只讓台責電能夠使用,該怎麼作好?</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">我想很多程式高手們早就發覺該怎麼做了,不過我還是雞婆一下把這個程式碼給出來,看了這個程式完成之後,我們就可以將我們所想要注意的股票一隻一隻的登入上去:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">設定檔如下所示:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">畫面如下所示:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">不過,這一個程式還有一個問題,那就是程式股價如果到了設定值了,就會一直呈現緊急的狀態,當然,此時我們可以從新的設定我們的目標,或者是經由</span><span lang="EN-US"><font face="Century">cgi</font></span><span style="font-family: PMingLiU;" lang="ZH-TW">來關閉股價的通知。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">或者,你也可以提供一個到達目標之後,自動再設定目標的超強大機能,不過這一個內容,就交由讀者來自行發揮了。</span></font></p> <p><font size="3"><span lang="EN-US"><font face= "Century">java</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">的語言雖然強大,在進行一些小型的開發時,我們有時可能還是會選擇一些簡單的</span><span lang="EN-US"><font face="Century">scriopt</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">式語言,因為這些語言很方便,而且很容易修改,不需要重新編譯。這一節裡面,我們希望利用</span><span lang="EN-US"><font face="Century">perl</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">這一個語言,來開發出股價監視配件:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">定義要求就如上一章所示,在這裡不在多加列出。只針對程式的部份來作說明。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">要得到網路上的網頁,我們可以利用</span><span lang= "EN-US"><font face="Century">perl</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">所提供的…含式庫。</span></font></p> <p><font size="3"><span lang="EN-US"><font face= "Century">perl</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">也提供了一個像是</span><span lang="EN-US"><font face= "Century">getopt</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">這樣子的程式庫。這個程式庫的名字是:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">同樣的,我們利用同樣的方法,在我們執行用的電腦上,安裝以上我們所需的含式庫。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來我們使用</span><span lang="EN-US"><font face= "Century">perl</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">來實現同樣的邏輯。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來我們使用</span><span lang="EN-US"><font face= "Century">shell script</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">及</span><span lang="EN-US"><font face= "Century">linux</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">的</span><span lang="EN-US"><font face= "Century">command</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">來實現同樣的邏輯。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來我們使用</span><span lang="EN-US"><font face= "Century">c</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">語言,及</span><span lang="EN-US"><font face= "Century">nagios</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">所提供的功用含式庫,來實現相同的邏輯。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">後記:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">如以上所示,我們展示了四種語言的開發範例,我在寫這一章的時候,一直覺得我該用四種語言,四種範例好,還是四種語言,一種範例。很明顯的,四種語言一種範列是我最後所選擇的,因為比較容易比較,同樣的事情可以用各種語言來實現,可以針對需要來選一個你認為最合適的語言。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">另外,我們也可以從以上的範例學到一些基本上寫作</span><span lang="EN-US"><font face="Century">plugin</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">所需要的共用技巧,除了核心的部份需要針對情況來改造之後,其他像是</span><span lang="EN-US"><font face="Century">command</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">的讀取,文字列的操作等等,都可以說是共通的。</span></font></p> <p><span style="font-family: PMingLiU;" lang="ZH-TW"><font size= "3">本章所談到的範例都可以在本書所附的光碟上找的到。</font></span></p>
<p><font size="3"><span lang="EN-US"><font face= "Century">Nagiosplugin</font></span> <span style="font-family: PMingLiU;" lang= "ZH-TW">的開發</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這一章我們要來看如何開發一個</span><span lang= "EN-US"><font face="Century">plagin</font></span><span style= "font-family: PMingLiU;" lang="ZH-TW">。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">在開放原始碼的世界裡,大家都可以寫軟體,大家都可以把自已的作品公開給大家使用。因此,</span><span lang="EN-US"><font face="Century">nagios</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">這個功能特強大的軟體,也已經有非常多的人為它寫了很多好用的</span><span lang="EN-US"><font face="Century">plugin</font></span><span style="font-family: PMingLiU;" lang="ZH-TW">,放在網路上讓大家下載使用。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這些讓大家下載來使用的</span><span lang="EN-US"><font face= "Century">plugin</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">如果寫的太爛,可能不用多久就會受到一些使用者的修改與補強,於是這個軟體就在眾人的努力之下愈變愈好。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">但是即使是如此,有的時候我們還是無法在網路上找到適合我們需求的</span><span lang="EN-US"><font face="Century">piugin</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">,此時我們就必須要自已開發了。依照</span><span lang= "EN-US"><font face="Century">nagios</font></span><span style= "font-family: PMingLiU;" lang="ZH-TW">所列出的</span><span lang= "EN-US"><font face="Century">plung</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">開發守則,一個成功且優良的</span><span lang= "EN-US"><font face="Century">plugin</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">是具有以下的條件的:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">而這個優良的插件的軟體在寫作之時,是必須要遵守以下的條件的:</span></font></p> <ol> <li><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">寫出這個插件的使用方法</span></font><br></li> <li><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這個插件的反回值需要遵守即定的格式</span></font><br></li> <li><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">考慮nagios執行的效能</span></font></li> <li><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">遵守命名規則<br></span></font></li> </ol> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">這些條件所規範的,是希望開發出來的插件是個容易被使用,並且不會造成nagios主機太大的負擔。因為nagios主機要負責運行很多的監視,也就是說要執行相當多的插件,當其中的某個插件具有不好的性能時,很容易對其他的服務造成影嚮。一個老鼠壞了一鍋州,就是在說這個意思。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">如果說這個插件是個plain-text,那麼使用者可以直接從原始碼來獲得資訊,如果不是的話,那麼這個插件就有提供這方面資訊的義務了。所以通常nagios插件,都會有help的選項,幫助使用者掌握使用方式。</span></font></p> <p><br></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">筆者當初在從事這個插件的開發之時,也是一直將這規範記在心裡。但是有的時候遇到專案經理的緊急要求,需要在短時間之內開發一個奇特服務的監視插件時,常常就把這些規範給制之於腦後了。</span></font></p> <br> <hr size="2" width="100%"> ● 開始動手吧!<br> <p><font size="3"><span style="font-family: PMingLiU;" lang="ZH-TW"><br> 當然解決任何問題最好的方法,就是找現有的答案。雖然我沒有仔細的調查過,但是我可以百分之一百的確定,所有常用服務的監視插件,都已經存在在這世界上的某一個角落了,所以你只要打開電腦,到</span><span lang="EN-US"><font face="Century">google</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">輸入一些關鍵字,一定可以找的到這些常用服務的監視插件,雖然它不一定是免費的。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">但是一些非常的客制化的服務,比方說你想要為你的客戶開發一個定期監視鳥龍裡的飼料是否以經被鳥吃完了這個特別的服務,可以就必需要自已寫了。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">自已寫插件並不是一件困難的事情,在講這這麼多前言之後,我們就先來展示一個全世界最簡單的</span><span lang="EN-US"><font face="Century">helloworld!</font></span><span style="font-family: PMingLiU;" lang="ZH-TW">級插件:</span></font></p> <table style="width: 495px; height: 49px;" border="1"> <tbody> <tr> <td>#!/bin/sh<br> echo OK- Hello World!<br> <br></td> </tr> </tbody> </table> <font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">夠簡單吧,這是一個</span><span lang="EN-US"><font face= "Century">shell</font></span> <span style="font-family: PMingLiU;" lang= "ZH-TW">指令,它只反回一個</span><span lang="EN-US"><font face= "Century">ok</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">,還有一個訊息</span><span lang="EN-US"><font face= "Century">hello world</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">,它給我們一個觀念,就是只要有反回值,而且<b>反回值是能夠讓nagios所認識的</b>,都可以被當作是插件來使用。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">我們先將這一個shell的指令集存成 <b>helloworldplugin.sh</b> . 保存在/usr/local/nagios/libexec裡面,此時,plugin的開發工作已經大功告成了。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來我們將它安裝到我們的</span><span lang= "EN-US"><font face="Century">nagios</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">上,安裝的步驟不管插件是簡單還是複雜,手續都是一樣的。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">首先我們先定義一個服務,我們可以以下面的方式來進行定義:為了簡化說明,我使用了定義檔的繼承方式(</span></font><font size="3"><span style="font-family: PMingLiU;" lang="ZH-TW">usegeneric-service</span></font> <font size="3"><span style= "font-family: PMingLiU;" lang= "ZH-TW">),很多東西都延用共通的設定,只列出我們要修改的部份:(各個文字列中間的空格,是一個半型的space)<br> </span></font></p> <table border="1" height="183" width="543"> <tbody> <tr> <th>services.cfg<br></th> </tr> <tr> <td valign="top">define service {<br> use generic-service<br> <b>host_namemycomputer----------------------------1<br></b><b>service_descriptionhello_world_test------------2</b><br> <b>check_command check_helloworld--------------3</b><br> <b>contact_groups me---------------------------------4</b><br> }</td> </tr> <tr> <td valign="top">說明:<br> <br> <ol> <li> 主機名稱,因為服務必須要存在於主機,所以我們要定義這個項目,這裡的mycomputer,是在hosts.cfg的檔案裡必須要先定義好的。</li> <li> 服務描述:關於這一項service的描述。儘量取可容易一目了然的名字,最好用英文,用中文的話會出現亂碼。</li> <li> 用來監視的命令名:這也是在checkcommand裡必須要先定義好的。</li> <li> 連絡群組:當服務發生問題時要聯絡誰,這也是必須要在contact.cfg裡事先定義好的。</li> </ol> </td> </tr> </tbody> </table> <font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">在完成了以上的設定細節,使用</span></font></p> <table border="1" height="29" width="485"> <tbody> <tr> <td><b>nagios -v /usr/local/nagios/etc/nagios.cfg</b></td> </tr> </tbody> </table> <font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">測式一下設定檔,如果沒有問題,就可以執行</span></font></p> <table border="1" height="29" width="489"> <tbody> <tr> <td><b>/etc/init.d/nagios restart</b><br></td> </tr> </tbody> </table> <font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">來重新啟動</span><span lang="EN-US"><font face= "Century">nagios</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">,過了不久只後,我們就會看到我們的</span><span lang= "EN-US"><font face="Century">nagios</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">出現了如下圖的訊息了。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW"><br></span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">當然,這個插件是絕對無法派上任何用場的,不過它就好像單細胞生物一樣至少它是個插件。</span></font></p> <hr size="2" width="100%"> <br> <p><font size="3"><span lang="EN-US"><font face= "Century">java</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">的語言雖然強大,在進行一些小型的開發時,我們有時可能還是會選擇一些簡單的</span><span lang="EN-US"><font face="Century">scriopt</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">式語言,因為這些語言很方便,而且很容易修改,不需要重新編譯。這一節裡面,我們希望利用</span><span lang="EN-US"><font face="Century">perl</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">這一個語言,來開發出股價監視配件:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">定義要求就如上一章所示,在這裡不在多加列出。只針對程式的部份來作說明。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">要得到網路上的網頁,我們可以利用</span><span lang= "EN-US"><font face="Century">perl</font></span><span style= "font-family: PMingLiU;" lang= "ZH-TW">所提供的…含式庫。</span></font></p> <p><font size="3"><span lang="EN-US"><font face= "Century">perl</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">也提供了一個像是</span><span lang="EN-US"><font face= "Century">getopt</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">這樣子的程式庫。這個程式庫的名字是:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">同樣的,我們利用同樣的方法,在我們執行用的電腦上,安裝以上我們所需的含式庫。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來我們使用</span><span lang="EN-US"><font face= "Century">perl</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">來實現同樣的邏輯。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來我們使用</span><span lang="EN-US"><font face= "Century">shell script</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">及</span><span lang="EN-US"><font face= "Century">linux</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">的</span><span lang="EN-US"><font face= "Century">command</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">來實現同樣的邏輯。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">接下來我們使用</span><span lang="EN-US"><font face= "Century">c</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">語言,及</span><span lang="EN-US"><font face= "Century">nagios</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">所提供的功用含式庫,來實現相同的邏輯。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">後記:</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">如以上所示,我們展示了四種語言的開發範例,我在寫這一章的時候,一直覺得我該用四種語言,四種範例好,還是四種語言,一種範例。很明顯的,四種語言一種範列是我最後所選擇的,因為比較容易比較,同樣的事情可以用各種語言來實現,可以針對需要來選一個你認為最合適的語言。</span></font></p> <p><font size="3"><span style="font-family: PMingLiU;" lang= "ZH-TW">另外,我們也可以從以上的範例學到一些基本上寫作</span><span lang="EN-US"><font face="Century">plugin</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">所需要的共用技巧,除了核心的部份需要針對情況來改造之後,其他像是</span><span lang="EN-US"><font face="Century">command</font></span><span style="font-family: PMingLiU;" lang= "ZH-TW">的讀取,文字列的操作等等,都可以說是共通的。</span></font></p> <p><span style="font-family: PMingLiU;" lang="ZH-TW"><font size= "3">本章所談到的範例都可以在本書所附的光碟上找的到。</font></span></p>

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。