使用Nagios監(jiān)視企業(yè)集群
Nagios 簡介
該部分演示如何安裝 Nagios 并綁定 Ganglia。我們將向 Nagios 添加兩個特性,幫助您監(jiān)視標準集群、網格、云(以及任何擴展計算的功能)。這兩個特性的作用是:
•監(jiān)視網絡交換機
•監(jiān)視資源管理器
在本例中,我們將監(jiān)視 TORQUE。完成之后,您將擁有一個控制監(jiān)視整個數(shù)據(jù)中心系統(tǒng)的框架。
Nagios 與 Ganglia 一樣,常用于 HPC 和其他環(huán)境,但是 Nagios 更加關注警告機制,Ganglia 則更加關注收集和跟蹤指標。Nagios 以前只是從目標主機收集信息,但最近開發(fā)了可以在主機上運行代理的插件。Nagios 內置了一個通知系統(tǒng)。
現(xiàn)在我們安裝 Nagios 并安裝基本的 HPC Linux® 監(jiān)視系統(tǒng)集群以滿足不同的監(jiān)視需求:
•應用程序開發(fā)人員現(xiàn)在可以看到隊列的飽和程度和運行作業(yè)的可用節(jié)點。
•系統(tǒng)失敗時會警告 NOC,并在 Nagios Web 界面看到閃爍的紅點。如果節(jié)點異常或者溫度太高,NOC 還將收到電子郵件通知。
•系統(tǒng)工程師可以繪制數(shù)據(jù),報告集群利用率,制定未來采購硬件的決策。
--------------------------------------------------------------------------------
安裝 Nagios
在機器上安裝 Nagios 的方法可以從 Internet 查詢。因為我經常需要在不同的環(huán)境中安裝,所以為此編寫了一個腳本。
首先需要 下載兩個包:
•Nagios(測試了 3.0.6 版本)
•Nagios-plugins(測試了 1.4.13 版本)
插件包括:
•Nagios Event Log,可以監(jiān)視 Windows 事件日志
•NRPE,提供了許多 Ganglia 功能
獲取源代碼并放在目錄中。為了演示,我在 /tmp 中放置了三個文件:
•nagios-3.0.6.tar.gz
•nagios-plugins-1.4.13.tar.gz
•naginstall.sh
清單 1 展示了 naginstall.sh 安裝腳本:
清單 1. naginstall.sh 腳本
- #!/bin/ksh
- NAGIOSSRC=nagios-3.0.6
- NAGIOSPLUGINSRC=nagios-plugins-1.4.13
- NAGIOSCONTACTSCFG=/usr/local/nagios/etc/objects/contacts.cfg
- NAGIOSPASSWD=/usr/local/nagios/etc/htpasswd.users
- PASSWD=cluster
- OS=foo
- function buildNagiosPlug {
- if [ -e $NAGIOSPLUGINSRC.tar.gz ]
- then
- echo "found $NAGIOSPLUGINSRC.tar.gz building and installing Nagios"
- else
- echo "could not find $NAGIOSPLUGINSRC.tar.gz in current directory."
- echo "Please run $0 in the same directory as the source files."
- exit 1
- fi
- echo "Extracting Nagios Plugins..."
- tar zxf $NAGIOSPLUGINSRC.tar.gz
- cd $NAGIOSPLUGINSRC
- echo "Configuring Nagios Plugins..."
- if ./configure --with-nagios-user=nagios --with-nagios-group=nagios
- -prefix=/usr/local/nagios > config.LOG.$$ 2>&1
- then
- echo "Making Nagios Plugins..."
- if make -j8 > make.LOG.$$ 2>&1
- then
- make install > make.LOG.$$ 2>&1
- else
- echo "Make failed of Nagios plugins. See $NAGIOSPLUGINSRC/make.LOG.$$"
- exit 1
- fi
- else
- echo "configure of Nagios plugins failed. See config.LOG.$$"
- exit 1
- fi
- echo "Successfully built and installed Nagios Plugins!"
- cd ..
- }
- function buildNagios {
- if [ -e $NAGIOSSRC.tar.gz ]
- then
- echo "found $NAGIOSSRC.tar.gz building and installing Nagios"
- else
- echo "could not find $NAGIOSSRC.tar.gz in current directory."
- echo "Please run $0 in the same directory as the source files."
- exit 1
- fi
- echo "Extracting Nagios..."
- tar zxf $NAGIOSSRC.tar.gz
- cd $NAGIOSSRC
- echo "Configuring Nagios..."
- if ./configure --with-command-group=nagcmd > config.LOG.$$ 2>&1
- then
- echo "Making Nagios..."
- if make all -j8 > make.LOG.$$ 2>&1
- then
- make install > make.LOG.$$ 2>&1
- make install-init > make.LOG.$$ 2>&1
- make install-config > make.LOG.$$ 2>&1
- make install-commandmode > make.LOG.$$ 2>&1
- make install-webconf > make.LOG.$$ 2>&1
- else
- echo "make all failed. See log:"
- echo "$NAGIOSSRC/make.LOG.$$"
- exit 1
- fi
- else
- echo "configure of Nagios failed. Please read $NAGIOSSRC/config.LOG.$$ for details."
- exit 1
- fi
- echo "Done Making Nagios!"
- cd ..
- }
- function configNagios {
- echo "We'll now configure Nagios."
- LOOP=1
- while [[ $LOOP -eq 1 ]]
- do
- echo "You'll need to put in a user name. This should be the person"
- echo "who will be receiving alerts. This person should have an account"
- echo "on this server. "
- print "Type in the userid of the person who will receive alerts (e.g. bob)> \c"
- read NAME
- print "What is ${NAME}'s email?> \c"
- read EMAIL
- echo
- echo
- echo "Nagios alerts will be sent to $NAME at $EMAIL"
- print "Is this correct? [y/N] \c"
- read YN
- if [[ "$YN" = "y" ]]
- then
- LOOP=0
- fi
- done
- if [ -r $NAGIOSCONTACTSCFG ]
- then
- perl -pi -e "s/nagiosadmin/$NAME/g" $NAGIOSCONTACTSCFG
- EMAIL=$(echo $EMAIL | sed s/\@/\\\\@/g)
- perl -pi -e "s/nagios\@localhost/$EMAIL/g" $NAGIOSCONTACTSCFG
- else
- echo "$NAGIOSCONTACTSCFG does not exist"
- exit 1
- fi
- echo "setting ${NAME}'s password to be 'cluster' in Nagios"
- echo " you can change this later by running: "
- echo " htpasswd -c $NAGIOSPASSWD $Name)'"
- htpasswd -bc $NAGIOSPASSWD $NAME cluster
- if [ "$OS" = "rh" ]
- then
- service httpd restart
- fi
- }
- function preNagios {
- if [ "$OS" = "rh" ]
- then
- echo "making sure prereqs are installed"
- yum -y install httpd gcc glibc glibc-common gd gd-devel perl-TimeDate
- /usr/sbin/useradd -m nagios
- echo $PASSWD | passwd --stdin nagios
- /usr/sbin/groupadd nagcmd
- /usr/sbin/usermod -a -G nagcmd nagios
- /usr/sbin/usermod -a -G nagcmd apache
- fi
- }
- function postNagios {
- if [ "$OS" = "rh" ]
- then
- chkconfig --add nagios
- chkconfig nagios on
- # touch this file so that if it doesn't exist we won't get errors
- touch /var/www/html/index.html
- service nagios start
- fi
- echo "You may now be able to access Nagios at the URL below:"
- echo "http://localhost/nagios"
- }
- if [ -e /etc/redhat-release ]
- then
- echo "installing monitoring on Red Hat system"
- OS=rh
- fi
- # make sure you're root:
- ID=$(id -u)
- if [ "$ID" != "0" ]
- then
- echo "Must run this as root!"
- exit
fi
preNagios
buildNagios
buildNagiosPlug
configNagios
postNagios
運行腳本 ./naginstall.sh
該代碼在 Red Hat 系統(tǒng)上能正常運行,如果您安裝了本系列 Ganglia 和 Nagios,第 1 部分:用 Ganglia 監(jiān)視企業(yè)集群 中提到的所有依賴關系,那么應該也能正常運行。運行 naginstall.sh 時,提示 Nagios 應該發(fā)送警告的用戶。稍后可以添加其他用戶。大部分組織都有一個郵件別名以組的形式發(fā)送郵件。
如果安裝時出現(xiàn)問題,可以查看 Nagios 網頁(鏈接見 參考資料)并將其添加到郵件列表。以我的經驗看來,像 Nagios 和 Ganglia 這樣成功的大部分包都很容易安裝。
#p#
配置 Nagios
假設腳本運行正常并且已經安裝了所有內容。那么在腳本成功退出時,您應該能夠打開 Web 瀏覽器并看到 localhost 已經被監(jiān)視了(如圖 1 所示):
通過單擊 Service Detail,您可以看到我們監(jiān)視本地機器上的哪些服務(比如 Ping、HTTP、加載、用戶等等),這是默認配置的。
讓我們看看名為 Root Partition 的服務。該服務在根分區(qū)滿時發(fā)出警告。通過查看安裝時生成的配置文件,您可以完全理解該檢查的工作方式。
主配置文件
如果使用 naginstall.sh 腳本,則主配置文件是 /usr/local/nagios/etc/nagios.cfg。該腳本展示幾個帶有其他定義的 cfg_files。其中的行如下:
- cfg_file=/usr/local/nagios/etc/objects/localhost.cfg
如果查看該文件,您將看到所有用于 Web 視圖中出現(xiàn)的 localhost 的服務。這就是配置默認服務的地方。根分區(qū)定義見第 77 行。
根分區(qū)檢查方式的體系結構
首先要注意 Nagios 對象的繼承模式。根分區(qū) 的定義使用本地服務定義,本地服務定義則使用通用服務定義。這定義了調用服務的方式、頻率以及其他可調試參數(shù)等等。
接下來重要的定義部分是使用的檢查命令。首先它使用名為 check_local_disk 的命令定義。傳遞的參數(shù)是 !20%!10%!/。表示當 check_local_disk 命令定義報告 20% 時,它將發(fā)出警告。當它到達 10% 時,您將得到一個嚴重錯誤。/ 表示它檢查 "/" 分區(qū)。check_local_disk 隱式調用 check_disk 命令,該命令位于 /usr/local/nagios/libexec 目錄中。
這是設置這些配置的基本思路。您可以按照該思路創(chuàng)建自己的服務來監(jiān)視所需的參數(shù)。有關更深入的內容,請閱讀文檔并嘗試自己設置一些參數(shù)。
注冊以收到警告
所有配置完成后,注冊以收到警告。我們開始時已經完成了該操作,但是如果希望更改或添加用戶,則可以修改 /usr/local/nagios/etc/objects/contacts.cfg 文件。將聯(lián)系人名稱改為您的名字,將電子郵件改為您的電子郵件地址。大部分基本的 Linux 服務器應該已經設置好,可以處理郵件了。
現(xiàn)在配置其他節(jié)點。
在 grid/cloud/cluster 中配置其他節(jié)點
我在 Dallas 數(shù)據(jù)中心有一組節(jié)點。我將創(chuàng)建一個目錄放置所有配置文件:
- mkdir -p /usr/local/nagios/etc/dallas
我需要通知 Nagios 我的配置文件將放在哪里。為此我修改 nagios.cfg 文件,添加以下行:
cfg_dir=/usr/local/nagios/etc/dallas
我將在此創(chuàng)建一組文件(很容易讓人糊涂)。
根據(jù)該圖繼續(xù)進行其他設置和安裝。
在 /usr/local/nagios/etc/dallas/nodes.cfg 文件中,我定義所有節(jié)點和節(jié)點組。我需要監(jiān)視三種機器:
•網絡服務器(本例中是運行 Ganglia 的 Linux 服務器)
•網絡交換機(我的交換機包括高速交換機和 Gigabit Ethernet)
•管理設備(比如刀片式管理模塊、老 IBM RSA 卡、BMC、可能的智能 PDU 等等)。
我創(chuàng)建三個相應的組,如下所示:
- define hostgroup {
- hostgroup_name dallas-cloud-servers
- alias Dallas Cloud Servers
- }
- define hostgroup
- hostgroup_name dallas-cloud-network
- alias Dallas Cloud Network Infrastructure
- }
- define hostgroup
- hostgroup_name dallas-cloud-management
- alias Dallas Cloud Management Devides
- }
接下來我創(chuàng)建三個模板文件,三個節(jié)點組的節(jié)點共享通用特征:
- define host {
- name dallas-management
- use linux-server
- hostgroups dallas-cloud-management
- # TEMPLATE!
- register 0
- }
- define host {
- name dallas-server
- use linux-server
- hostgroups dallas-cloud-servers
- # TEMPLATE!
- register 0
- }
- define host {
- name dallas-network
- use generic-switch
- hostgroups dallas-cloud-network
- # TEMPLATE!
- register 0
- }
現(xiàn)在我的每個節(jié)點定義為 dallas-management、dallas-server 或 dallas-network。各自的示例如下:
- define host {
- use dallas-server
- host_name x336001
- address 172.10.11.1
- }
- define host {
- use dallas-network
- host_name smc001
- address 172.10.0.254
- }
- define host {
- use dallas-management
- host_name x346002-rsa
- address 172.10.11.12
- }
我生成了一個遍歷節(jié)點列表的腳本,并使用我的 Dallas 實驗室中的節(jié)點完全填充這個文件。當我重啟 Nagios 時,將檢查這些節(jié)點是否可以到達。但是我還有其他一些服務!
您應該首先重啟 Nagios 保證設置完成。如果已經完成,則應該在 HostGroup Overview 視圖下看到一些組。如果有錯誤,則運行:
- /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
這將驗證文件并幫助您發(fā)現(xiàn)錯誤。
現(xiàn)在可以添加一些基本的服務了。根據(jù) localhost 中的模板,較容易完成的是查看 dallas-cloud-servers 組上的 SSH。讓我們啟動另一個文件:/usr/local/nagios/etc/dallas/host-services.cfg。最簡單的是將配置從希望監(jiān)視的 localhost 中復制出來。我就是這樣做的,并添加了一個依賴關系:
- define service{
- use generic-service
- hostgroup_name dallas-cloud-servers
- service_description SSH
- check_command check_ssh
- }
- define service{
- use generic-service
- hostgroup_name dallas-cloud-servers
- service_description PING
- check_command check_ping!100.0,20%!500.0,60%
- }
- define servicedependency{
- hostgroup_name dallas-cloud-servers
- service_description PING
- dependent_hostgroup_name dallas-cloud-servers
- dependent_service_description SSH
- }
如果 PING 無法正常工作,我不會考慮測試 SSH。現(xiàn)在開始可以添加各種內容了,但我們再看看其他東西。重啟 Nagios 并測試菜單,以確??吹?ping 和 ssh 檢查了節(jié)點:
- service nagios reload
如果一切正常,我們將開始進入有趣的部分 —— 集成 Ganglia。
#p#
集成 Nagios 報告 Ganglia 指標
Nagios Exchange 是另一個獲取 Nagios 插件的好地方。但是對于我們的 Ganglia 插件,只要從 Ganglia 和 Nagios,第 1 部分:用 Ganglia 監(jiān)視企業(yè)集群 中下載的源代碼中查找。假設您將源代碼解壓到 /tmp 目錄中,剩下的只需要復制 contrib 目錄中的 check_ganglia.py 腳本即可:
- cp /tmp/ganglia-3.1.1/contrib/check_ganglia.py \
- /usr/local/nagios/libexec/
check_ganglia 是一個很棒的 Python 腳本,可以運行于 gmetad 運行的服務器上(在我的示例中是 Nagios 運行的管理服務器)。讓我們在端口 8649 上查詢 localhost。使用這種方法,您可以通過遠程命令擴展網絡通訊:可以使用 Ganglia 的擴展技術實現(xiàn)!
如果運行 telnet localhost 8649,您將看到從節(jié)點收集的數(shù)據(jù)中生成大量輸出(假設按照第 1 部分安裝了 Ganglia 并能正常運行)。讓我們監(jiān)視一些 Ganglia 提供的內容。
進入 /var/lib/ganglia/rrds 目錄,您可以看到每個主機的度量指標。生成了易于查看的圖形,您可以一直分析指標。我們將度量 load_one 和 disk_free,由于在第 1 部分中我們啟用了 IPMI 溫度度量,我們將同樣添加該度量。
創(chuàng)建 /usr/local/nagios/etc/dallas/ganglia-services.cfg 文件并添加服務:
- define servicegroup {
- servicegroup_name ganglia-metrics
- alias Ganglia Metrics
- }
- define command {
- command_name check_ganglia
- command_line $USER1$/check_ganglia.py -h $HOSTNAME$ -m $ARG1$ -w $ARG2$ -c $ARG3$
- }
- define service {
- use generic-service
- name ganglia-service
- hostgroup_name dallas-cloud-servers
- service_groups ganglia-metrics
- notifications_enabled 0
- }
- define service {
- use ganglia-service
- service_description load_one
- check_command check_ganglia!load_one!4!5
- }
- define service {
- use ganglia-service
- service_description ambient_temp
- check_command check_ganglia!AmbientTemp!20!30
- }
- define service {
- use ganglia-service
- service_description disk_free
- check_command check_ganglia!disk_free!10!5
- }
重啟 Nagios 時,現(xiàn)在可以根據(jù) Ganglia 指標發(fā)出警告!
提醒:check_ganglia.py 命令僅在閾值過高時發(fā)出警告。如果希望在閾值過低時發(fā)出警告(在 disk_free 中是這樣),則需要修改代碼。我更改了文件的最后部分,如下所示:
- if critical > warning:
- if value >= critical:
- print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value)
- sys.exit(2)
- elif value >= warning:
- print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value)
- sys.exit(1)
- else:
- print "CHECKGANGLIA OK: %s is %.2f" % (metric, value)
- sys.exit(0)
- else:
- if critical >= value:
- print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value)
- sys.exit(2)
- elif warning >= value:
- print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value)
- sys.exit(1)
- else:
- print "CHECKGANGLIA OK: %s is %.2f" % (metric, value)
- sys.exit(0)
現(xiàn)在重新加載 Nagios:
- service nagios restart
如果一切正常,您應該看到 Ganglia 數(shù)據(jù)現(xiàn)在已經在 Nagios 的監(jiān)視之下!
結合使用 Ganglia 和 Nagios,您可以監(jiān)視任何內容。您可以控制整個云!
#p#
擴展 Nagios:監(jiān)視網絡交換機
隨著云和虛擬化的流程,原來的 “網絡管理員” 和 “系統(tǒng)管理員” 之間的界線更加模糊起來。忽視配置網絡交換機和理解網絡技術的系統(tǒng)管理員將面臨過時的風險。
不用再擔心完整性,我將展示如何擴展 Nagios 來監(jiān)視網絡交換機。使用 Nagios(而不是網絡交換機供應商的解決方案)監(jiān)視網絡交換機的優(yōu)點很簡單 —— 使用 Nagios 您可以監(jiān)視任何 供應商的交換機??吹?ping 成功后,我們將探討交換機上的 SNMP。
有些交換機默認啟用 SNMP。您可以根據(jù)供應商的說明設置。要在 Cisco Switch 上設置 SNMP,請參考以下示例,我的交換機的主機名為 c2960g:
- telnet c2960g
- c2960g>enable
- c2960g#configure terminal
- c2960g(config)#snmp-server host 192.168.15.1 traps SNMPv1
- c2960g(config)#snmp-server community public
- c2960g(config)#exit
- c2960g#copy running-config startup-config
現(xiàn)在看看能夠監(jiān)視的內容,運行 snmpwalk 并將其導出到文件:
- snmpwalk -v 1 -c public c2960g
如果一切正常,您將看到許多內容傳遞回來。然后可以捕獲輸出并查看各種要監(jiān)視的位置。
我還有一個交換機示例。當我運行 snmpwalk 命令時,我看到端口以及做標記的方式。我對以下信息很感興趣:
•MTU(IF-MIB::ifMtu.)。
•端口運行速度(IF-MIB::ifSpeed.)。
•端口是否正常(IF-MIB::ifOperStatus.)。
為了監(jiān)視這些內容我創(chuàng)建了一個新文件,/usr/local/nagios/etc/dallas/switch-services.cfg。我將網絡主機映射到交換機,因此我對所有事情了如指掌。建議您也這樣做。如果想體驗真正的云計算,就應該了解所有資源的狀態(tài)。
我將使用節(jié)點 x336001 作為示例。我知道它位于端口 5。我的文件如下所示:
- define servicegroup {
- servicegroup_name switch-snmp
- alias Switch SNMP Services
- }
- define service {
- use generic-service
- name switch-service
- host_name smc001
- service_groups switch-snmp
- }
- define service {
- use switch-service
- service_description Port5-MTU-x336001
- check_command check_snmp!-o IF-MIB::ifMtu.5
- }
- define service {
- use switch-service
- service_description Port5-Speed-x336001
- check_command check_snmp!-o IF-MIB::ifSpeed.5
- }
- define service {
- use switch-service
- service_description Port5-Status-x336001
- check_command check_snmp!-o IF-MIB::ifOperStatus.5
- }
完成后,重啟 Nagios,您會發(fā)現(xiàn)現(xiàn)在我可以查看交換機了:
這只是如何監(jiān)視交換機的一個示例。注意,我沒有設置警告,也沒有指出關鍵動作。您可能還注意到了,在 libexec 目錄中還有一些選項可以完成類似的功能。check_ifoperstatus 以及其他內容也需要技巧。使用 Nagios 時,可以使用多種方式完成一個任務。
#p#
擴展 Nagios:報告監(jiān)視 TORQUE 的作業(yè)
可以根據(jù) TORQUE 編寫許多腳本來確定該隊列系統(tǒng)的運行方式。在該擴展中,假設您已經安裝了 TORQUE。TORQUE 是一個可以與 Moab 和 Maui 結合使用的資源管理器??梢詤⒖?Colin Morey 編寫的 開源 Nagios 插件。
下載并將其放在 /usr/local/nagios/libexec 目錄,確定它可以執(zhí)行。我必須稍微修改代碼,將安裝 Nagios 的目錄從 use lib "/usr/nagios/libexec"; 更改為 use lib "/usr/local/nagios/libexec";。我還必須將 my $qstat = '/usr/bin/qstat' ; 更改為 qstat 命令。我的命令如下所示:my $qstat = '/opt/torque/x86_64/bin/qstat' ;。
驗證它能運行(我使用的隊列名為 dque):
- [root@redhouse libexec]# ./check_pbs.pl -Q dque -tw 20 -tm 50
- check_pbs.pl Critical: dque on localhost checked, Total number of jobs
- higher than 50. Total jobs:518, Jobs Queued:518, Jobs Waiting:0, Jobs
- Halted:0 |exectime=9340us
您可以使用 -h 選項顯示更多要監(jiān)視的內容?,F(xiàn)在將它放置到配置文件 /usr/local/nagios/etc/dallas/torque.cfg:
- define service {
- use generic-service
- host_name localhost
- service_description TORQUE Queues
- check_command check_pbs!20!50
- }
- define command {
- command_name check_pbs
- command_line $USER1$/check_pbs.pl -Q dque
- -tw $ARG1$ -tm $ARG2$
- }
重啟 Nagios 之后,將在 localhost 下顯示該服務。
在我的例子中,我收到了一個嚴重警告,因為我的隊列中有 518 個作業(yè)!
顯然,跟蹤 TORQUE 和腳本有很多方式。您可以使用 pbsnodes 通知節(jié)點狀態(tài)。人們應該更關心節(jié)點的運行位置以及運行的作業(yè)。這個小示例將展示各種可能性,以及如何在很短的時間內完成監(jiān)視解決方案。
結束語
閱讀了該系列之后,系統(tǒng)管理員應該能夠輕松運行 Ganglia 和 Nagios,以前所未有的方式監(jiān)視其數(shù)據(jù)中心。這兩個包的范圍非常廣泛。我們在這里接觸的只是與集群、網格和云基礎結構相關的內容。
設置該監(jiān)視解決方案的大部分時間都用于配置要監(jiān)視的服務。許多現(xiàn)有的替代解決方案都是平臺而不是成品。換句話說,它們提供框架來支持插件,但很少有預先建好的插件。大部分插件的工作由管理員和用戶完成,這些工作往往非常繁瑣。實際上,這就是大部分數(shù)據(jù)中心監(jiān)視的內容。
【編輯推薦】