单位一直用Nagios做数据中心的服务监控,由于近期应用升级频繁,经常需要配合启、停nagios进程,以免产生错误告警。为了使升级流程更顺畅,希望给应用组一个PHP网页来控制Nagios程序。

开始动手做PHP,遇到两个难点:1. 如何用PHP来执行系统命令;2. 如何用有效php用户控制系统进程。

难点一解决过程:参考http://www.21andy.com/blog/20101018/1981.html,从中选择使用exec()函数。原型:string exec (string command [, string array [, int return_var]]) 。具体语句:

exec('/etc/init.d/nagios status',$r, $err_code); //$r: 命令返回字符串;$err_code,命令返回错误代码;

难点二:php以apache身份在系统中运行,无权限控制nagios进程,这时需要用sudo以及相关的/etc/sudoers来帮助。在/etc/sudoers中加入以下行:

 

apache  ALL=NOPASSWD:/etc/init.d/nagios start

apache  ALL=NOPASSWD:/etc/init.d/nagios stop

apache  ALL=NOPASSWD:/etc/init.d/nagios reload

apache  ALL=NOPASSWD:/usr/sbin/nagios *

同时注释掉Defaults    requiretty 行,以消除"sudo: no tty present and no askpass program specified"报错。 具体控制语句如下:

  1. exec('sudo /etc/init.d/nagios start',$r$err_code); 
  2.         if($err_code!=0){ 
  3.            echo "<br> we had a problem with error code: ".$err_code
  4.         } 
  5.         else
  6.          echo "<br> Monitoring is on now!"
  7.         } 

难点解决之后,其他工作就相对容易了。

现在已经将控制权转移到应用组,而本人可以不用再等通知去上下监控系统频繁开关nagios服务了。PHP真是无所不能呀!