分类目录归档:监控系统

inotify,独立使用

2022.01.09,更新此脚本
添加了excludePath为数组,可以添加任意多的排除目录,不用每个都做判断,批量判断

#/bin/bash
#配置系统参数
echo 16384 > /proc/sys/fs/inotify/max_queued_events
echo 128 > /proc/sys/fs/inotify/max_user_instances
echo 9999999 > /proc/sys/fs/inotify/max_user_watches

excludePath=(‘/data/web/db/data/tempstatic’ ‘/data/web//data/tempstatic’ ‘/data/web/123/runtime’ ‘/data/web/123_db/runtime’)
#excludePath数组长度为num
num=${#excludePath[@]}
stat=0

inotifywait -mrq –timefmt ‘%Y%m%d%H%M%S’ –format ‘%T %w%f %e’ –event delete,modify,create,attrib,move,moved_to,moved_from /data/web | while read date file event
do
case $event in
MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
if [ “${file##*.}”x = “php”x ]||[ “${file##*.}”x = “js”x ]||[ “${file##*.}”x = “html”x ];then
for filepath in ${excludePath[@]}
do
realFilePath=`dirname $file`
res=`echo $realFilePath|grep $filepath`

if [ -z $res ];then
stat=`expr $stat + 1`
fi
done
#上面for循环,如果找到,则stat一定是3
if [ $stat -eq $num ];then
echo $event’ – ‘$file’ – ‘$date >> /var/log/web_watch.log
stat=0
else
stat=0
fi
fi
;;

MOVED_TO|MOVED_FROM|DELETE|DELETE,ISDIR)
if [ “${file##*.}”x = “php”x ]||[ “${file##*.}”x = “js”x ]||[ “${file##*.}”x = “html”x ];then
for filepath in ${excludePath[@]}
do
realFilePath=`dirname $file`
res=`echo $realFilePath|grep “$filepath”`

if [ -z $res ];then
stat=`expr $stat + 1`
fi
done
#上面for循环,如果找到,则stat一定是3
if [ $stat -eq $num ];then
echo $event’ – ‘$file’ – ‘$date >> /var/log/web_watch.log
stat=0
else
stat=0
fi
fi
;;
esac
done

结束

 

 

 


#/bin/bash

    inotifywait -mrq --timefmt '%Y%m%d%H%M%S' --format '%T %w%f %e' --event delete,modify,create,attrib,move,moved_to,moved_from /data/web | while read date file event
    do
        case $event in
           MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
                if [ "${file##*.}"x = "php"x ]||[ "${file##*.}"x = "js"x ]||[ "${file##*.}"x = "html"x ];then
                    echo $event' - '$file' - '$date >> /var/log/web_watch.log
                fi
                ;;

        MOVED_TO|MOVED_FROM|DELETE|DELETE,ISDIR)
            if [ "${file##*.}"x = "php"x ]||[ "${file##*.}"x = "js"x ]||[ "${file##*.}"x = "html"x ];then
            echo $event' - '$file' - '$date >> /var/log/web_watch.log
            fi
            ;;
       esac
done

 

2022.01.03改写后的shell脚本

#/bin/bash
#配置系统参数
echo 16384 > /proc/sys/fs/inotify/max_queued_events
echo 128 > /proc/sys/fs/inotify/max_user_instances
echo 9999999 > /proc/sys/fs/inotify/max_user_watches
#排除bbb和aaa目录的文件变动

excludePath="/data/web/bbb/data/tempstatic"
excludePath2="/data/web/aaa/data/tempstatic"

inotifywait -mrq --timefmt '%Y%m%d%H%M%S' --format '%T %w%f %e' --event delete,modify,create,attrib,move,moved_to,moved_from /data/web | while read date file event
do
    case $event in
       MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
           if [ "${file##*.}"x = "php"x ]||[ "${file##*.}"x = "js"x ]||[ "${file##*.}"x = "html"x ];then
               realFilePath=`dirname $file`
               res=`echo $realFilePath|grep $excludePath`
               res2=`echo $realFilePath|grep $excludePath2`

           if [ -z $res ] && [ -z $res2 ];then
                echo $event' - '$file' - '$date >> /var/log/web_watch.log
            fi

         fi
      ;;

       MOVED_TO|MOVED_FROM|DELETE|DELETE,ISDIR)
            if [ "${file##*.}"x = "php"x ]||[ "${file##*.}"x = "js"x ]||[ "${file##*.}"x = "html"x ];then
                  realFilePath=`dirname $file`
                   res=`echo $realFilePath|grep "$excludePath"`
                   res2=`echo $realFilePath|grep $excludePath2`

             if [ -z $res ] && [ -z $res2 ];then
                  echo $event' - '$file' - '$date >> /var/log/web_watch.log
                  #echo $event' - '$file' - '$date >> /data/web/zx123/analyseLogs/monitorChangeLog/web_watch.log
             fi
         fi
       ;;
       esac
done

 

通过使用nohup /home/sh/inotify_web.sh &
让程序在后台运行

nagios的远程nrpe运行指定脚本,重启服务,event_handler指令

网上看了,大部分都是远程处理故障,也就是远程执行命令,需要无密码登录,配置ssh的key,既然有了check_nrpe,为何还需要远程执行,那不就是脱裤子放屁吗。

例子环境如下:

监控服务器上安装了nagios和check_nrpe,ip为192.168.0.100
被监控服务器安装nrpe的客户端,ip为192.168.0.200

客户端操作,也就是192.168.0.200操作
1、建立监控脚本,我们来监控php进程是否关掉,如果挂掉,在报警前我们重启apache,脚本名为handle_php,路径为/usr/local/nagios/libexec 如下:

#!/bin/bash
case "$1" in

    OK)
        echo 'ok' >> /usr/local/nagios/var/tmp.txt
        ;;
    WARNING)
        echo 'WARNING' >> /usr/local/nagios/var/tmp.txt
        ;;
    UNKNOWN)
        echo 'unknown' >> /usr/local/nagios/var/tmp.txt
        ;;
    CRITICAL)
        case "$2" in
            SOFT)
                case "$3" in
                    3)
                        echo 'sudo /etc/rc.d/init.d/httpd restart3' >>  /usr/local/nginx/var/tmp.txt
                        ;;
                    2)
                        echo 'sudo /etc/rc.d/init.d/httpd restart2' >> /usr/local/nagios/var/tmp.txt
                        ;;
                    1)
                        echo 'sudo /etc/rc.d/init.d/httpd restart1' >> /usr/local/nagios/var/tmp.txt
                        ;;
                    *)
                        echo 'critical*' >> /usr/local/nagios/var/tmp.txt
                esac
                ;;
            HARD)
                #这里的sudo 以及重启的命令,仅仅打印,只是为了说明可以执行,方便测试
                echo 'sudo /etc/rc.d/init.d/httpd restart' >> /usr/local/nagios/var/tmp.txt
               ;;
            *)
            echo 'aaaaaa' >> /usr/local/nagios/var/tmp.txt
            ;;
        esac
        ;;
    *)
        #打印参数,用于测试
        echo $1,$2,$3 >> /usr/local/nagios/var/tmp.txt
       ;;
    esac
exit 0

2、测试,看看脚本是否能执行
#/usr/local/nagios/libexec/handle_php CRITICAL soft 3
运行完毕后,在/usr/local/nagios/var/tmp.txt 中出现critical*,说明脚本运行没问题

3、编辑/usr/local/nagios/etc/nrpe.cfg文件,添加内容如下:
command[handle_php]=sudo /usr/local/nagios/libexec/handle_php $ARG1$ $ARG2$ $ARG3$
解释一下,$ARG1$ $ARG2$ $ARG3$三个参数,用空格分开
配置文件中   dont_blame_nrpe=1 ,默认为0,大概的意思是“

这个选项决定了NRPE守护进程是否允许客户端指定执行命令的参数。 这个选项需要在安装nrpe的时候开启——enable-command-args参数,否则不能用,***启用此选项存在安全风险! *** 
上面红字重要,否则,客户端脚本执行不了
重启nrpe,
killall nrpe
/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

测试,通过在服务器上运行
/home/system/nagios/libexec/check_nrpe -H 192.168.0.200 -c handle_php -a CRITICAL SOFT 3
客户端查看/usr/local/nginx/var/tmp.txt的内容,有打印信息,客户端配置成功。

4、配置服务器端,配置主机监控文件,如下:
define service{
      use                                   hosta-service                                   ; Name of service template to use
      host_name                     a-192.168.0.200
      service_description      HTTP
      check_command          check_nrpe!check_http
      event_handler              check_nrpe!handle_php -a $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$
}

5、配置完毕,测试
重启systemctl restart nagios

经过以上配置,当触发错误信息三次的时候,发报警信息前,可以远程执行恢复命令
欢迎留言!

监控系统Nagios状态类型 SOFT和HARD

搞了这么多久的nagios,居然没用过handle_event事件,正好有事情需要,就学习一下2021.12.27

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

监控系统Nagios系列(二) 架构中提到了如何定义对象的状态,对象状态根据是插件检查结果综合得到的。

对象状态如果发生了变化,Nagios会调用通知命令,发送警报。为了避免错误的警报,Nagios允许用户定义最大尝试次数(max_check_attempts),只有状态连续变化超过了最大尝试次数,才算是的状态变化。Nagios通过定义两种状态变化类型:softhard,分别表示在max_check_attempts内的状态变化,和超过了max_check_attempts的状态变化。这种做法能够解决的一个典型问题就是状态处于抖动不稳定的对象,通过max_check_attempts,避免重复的警报。

1. soft类型

soft类型状态变化产生的条件为:

  • 检查Service或Host状态的插件返回结果为non-OK或non-UP,且检查次数还未达到max_check_attempts,那么这个状态变化是soft类型,是一个soft error。
  • 一个Service或Host从soft error恢复(插件检查返回结果为OK或UP),那么这个状态变化是soft类型,是一个soft recovery。

当soft状态变化发生之后,Nagios对应的处理有:

  • 记录日志
  • 调用外部注册的事件处理回调命令。开发者可以注册事件处理回调命令,尝试修复soft error,在soft error变为hard error之前。

2. hard类型

hard类型状态变化产生条件为:

  • 检查Service或Host状态的插件返回结果为non-OK或non-UP,且检查次数已经达到max_check_attempts,那么这个状态变化是hard类型,是一个hard error。
  • 一个Service或Host的状态由一个hard类型变化为另外一个hard类型,这次变化也是hard类型。如从Warning变为Critical。
  • 一个Service的检查结果为non-OK状态,且与其关联的Host的状态是DOWN或UNREACHABLE,那么Service的状态变化是hard类型,是一个hard error。
  • 一个Service或Host从hard error恢复,那么这个状态变化是hard类型,是一个hard recovery。
  • Service或Host的状态检查类型为passive_check(由外部注入状态),且全局配置文件(nagios.cfg)中的配置项“ passive_host_checks_are_soft”为0,那么passive_check的检查结果导致的状态变化,都是hard类型。

当hard状态变化发生之后,Nagios对应的处理有:

  • 记录日志
  • 调用外部注册的事件处理回调命令。
  • 通知联系人。

nagios-4.4.6安装,centos7

手册地址:https://support.nagios.com/kb/article/nagios-core-installing-nagios-core-from-source-96.html

可以完全参考上面的安装方法

我的apache是自己手工安装的,/home/system/apache,在执行make install-webconf的时候,提示失败,看提示是复制到/etc/httpd/conf.d目录了,我没有这个目录,于是手工建立,成功,然后把conf.d/nagios.conf复制到/home/system/apache/conf/extra/nagios.conf

按照提示,安装完毕后,apache启动,nagios启动,但是cgi文件提示下载,打开httpd.conf中的LoadModule cgid_module modules/mod_cgid.so模块,重启就好了

mark,2021.11.26日凌晨

nagios,本地发送报警邮件超时问题

最近在外网新搭了一套nagios系统,开始几天系统出了问题nagios还能发邮件通知,可最近出了问题老收不到邮件,手工在服务器上发邮件又可以,后来一查sendmail的日志和nagios的日志,发现sendmail的邮件只有邮件信息,没有进邮件队列.nagios那边的日志又报下面的警告:

[1292174436] Warning: Contact ‘wahaha’ service notification command ‘/usr/bin/printf “%b” “***** Nagios *****\n\nNotification Type: PROBLEM\n\nService: /boot\nHost: hostname\nAddress: 192.168.3.11\nState: CRITICAL\n\nDate/Time: Mon Dec 13 01:20:05 CST 2010\n\nAdditional Info:\n\nDISK CRITICAL – free space: /boot
8 MB (8% inode=99%):” | /bin/mail -s “** PROBLEM Service Alert: hostname//boot is CRITICAL **” wahaha@163.com’ timed out after 30 seconds

从上面的日志看,应该是发送超时了,也就是说设置的通知时间还不够能让sendmail发出邮件的时间,到这就好办了.通过修改nagios的配置文件nagios.cfg,将notification_timeout=30改为notification_timeout=120后重起nagios.发现已经能收到报警邮件了,到此问题解决!

cacti插件安装

thold插件安装,0.8.7g的cacti

点击thold的标签,出错“You are missing a dependency for thold, please install the ‘Settings’ plugin.”
原来只是需要在安装个settings插件就可以了,郁闷的。

下载后安装即可
wget http://docs.cacti.net/_media/plugin:settings-v0.7-1.tgz

snmpd的日志手册

LOGGING OPTIONS
The mechanism and destination to use for logging of warning and error mes-
sages can be controlled by passing various parameters to the -L flag.

-Le Log messages to the standard error stream.

-Lf FILE
Log messages to the specified file.

-Lo Log messages to the standard output stream.

-Ls FACILITY
Log messages via syslog, using the specified facility (’d’ for
LOG_DAEMON, ’u’ for LOG_USER, or ’0’-’7’ for LOG_LOCAL0 through
LOG_LOCAL7).

There are also "upper case" versions of each of these options, which allow
the corresponding logging mechanism to be restricted to certain priorities
of message. Using standard error logging as an example:

-LE pri
will log messages of priority ’pri’ and above to standard error.

-LE p1-p2
will log messages with priority between ’p1’ and ’p2’ (inclusive)
to standard error.

For -LF and -LS the priority specification comes before the file or facil-
ity token. The priorities recognised are:

0 or ! for LOG_EMERG,
1 or a for LOG_ALERT,
2 or c for LOG_CRIT,
3 or e for LOG_ERR,
4 or w for LOG_WARNING,
5 or n for LOG_NOTICE,
6 or i for LOG_INFO, and
7 or d for LOG_DEBUG.

Normal output is (or will be!) logged at a priority level of LOG_NOTICE

Nagios分布式配置

摘自:http://www.comeonsa.com/2010/08/nagios%e5%88%86%e5%b8%83%e5%bc%8f%e9%85%8d%e7%bd%ae/comment-page-1/#comment-237

Nagios分布式配置
2010年8月14日 k9.huang 发表评论 阅读评论
nagios的分布式是通过在主服务端开启nsca接口进行内容的接收,客户端通过调用send_nsca程序,进行内容的传输,服务端在接收到约定格式的内容后,进行告警。以下内容省略了,nagios的主服务端与分布式服务端的安装步骤。

一、NSCA插件安装与配置
http://nchc.dl.sourceforge.net/sourceforge/nagios/nsca-2.7.2.tar.gz

编译安装nsca:
查看源代码打印帮助0 ./configure && make all

nagios主服务端:
1.拷贝nsca相关文件至nagios目录
查看源代码打印帮助0 cp sample-config/nsca.cfg /usr/local/nagios/etc/

1 cp src/nsca /usr/local/nagios/bin/

2 chown nagios.nagios /usr/local/nagios/etc/nsca.cfg

3 chown nagios.nagios /usr/local/nagios/bin/nsca

2.配置nsca.cfg文件中password
查看源代码打印帮助0 vi /usr/local/nagios/etc/nsca.cfg #去掉password前面的#,设置密码

1 password=xxx

3.开启nsca程序
查看源代码打印帮助0 /usr/local/nagios/bin/nsca -c /usr/local/nagios/etc/nsca.cfg

4.开启防火墙5667端口
查看源代码打印帮助0 iptables -I RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 5667 -j ACCEPT

nagios分布式服务端:
1.拷贝send_nsca相关文件至nagios目录
查看源代码打印帮助0 cp sample-config/send_nsca.cfg /usr/local/nagios/etc/

1 cp src/send_nsca /usr/local/nagios/bin/

2 chown nagios.nagios /usr/local/nagios/etc/send_nsca.cfg

3 chown nagios.nagios /usr/local/nagios/bin/send_nsca

2.配置nsca.cfg文件中password
查看源代码打印帮助0 vi /usr/local/nagios/etc/send_nsca.cfg #去掉password前面的#,配置与主服务端相同的密码

1 password=xxx

二、Nagios主服务端与分布式服务端配置
nagios主服务端:
1.修改nagios.cfg文件
查看源代码打印帮助0 vi /usr/local/nagios/etc/nagios.cfg

1 #修改以下参数值

2 check_external_commands=1

3 accept_passive_service_checks=1

4 accept_passive_host_checks=1

2.修改服务与主机的监控,以下为配置示例,该示例定义的服务与主机应该与分布式服务端相同
查看源代码打印帮助00 define host{

01 name test

02 use generic-host

03 address 192.168.0.8 #分布式服务端内监控的主机地址

04 passive_checks_enabled 1 #开启被动检测模式

05 active_checks_enabled 0 #关闭主服务端对该主机的主动检测

06 }

07 define service{

08 use generic-service #根据实际情况修改

09 host_name test

10 service_description CPU Load

11 check_command check_nrpe!check_load

12 check_freshness 1 #开启强制刷新

13 freshness_threshold 450 #主服务端强制刷新的时间,具体含义请参考手册

14 passive_checks_enabled 1 #开启被动检测模式

15 active_checks_enabled 0 #关闭主服务端对该服务的主动检测

16 }

nagios分布式服务端:
1.修改nagios.cfg文件
查看源代码打印帮助0 vi /usr/local/nagios/etc/nagios.cfg

1 #修改以下参数值

2 enable_notifications=0

3 obsess_over_services=1

4 ocsp_command=submit_check_result

5 obsess_over_hosts=1

6 ochp_command=submit_check_result

2.创建submit_check_result脚本
查看源代码打印帮助00 vi /usr/local/nagios/libexec/submit_check_result

01 #!/bin/sh

02 # Arguments:

03 # = host_name (Short name of host that the service is

04 # associated with)

05 # = svc_description (Description of the service)

06 # = state_string (A string representing the status of

07 # the given service – “OK”, “WARNING”, “CRITICAL”

08 # or “UNKNOWN”)

09 # = plugin_output (A text string that should be used

10 # as the plugin output for the service checks)

11 #

12 # Convert the state string to the corresponding return code

13 return_code=-1

14 case “$3” in

15 OK)

16 return_code=0

17 ;;

18 WARNING)

19 return_code=1

20 ;;

21 CRITICAL)

22 return_code=2

23 ;;

24 UNKNOWN)

25 return_code=-1

26 ;;

27 esac

28 # pipe the service check info into the send_nsca program, which

29 # in turn transmits the data to the nsca daemon on the central

30 # monitoring server

31 /usr/bin/printf “%s\t%s\t%s\t%s\n” “$1” “$2” “$return_code” “$4” | /usr/local/nagios/bin/send_nsca -H 1.1.1.1(修改为主服务端的ip) -c /usr/local/nagios/etc/send_nsca.cfg
查看源代码打印帮助0 chmod +x /usr/local/nagios/libexec/submit_check_result

1 chown nagios.nagios submit_check_result

3.在command.cfg文件中定义submit_check_result命令
查看源代码打印帮助0 vi /usr/local/nagios/etc/objects/command.cfg

1 #加入以下内容

2 define command{

3 command_name submit_check_result

4 command_line /usr/local/nagios/libexec/submit_check_result $HOSTNAME$ ‘$SERVICEDESC$’ $SERVICESTATE$ ‘$SERVICEOUTPUT$’

5 }

4.配置示例
查看源代码打印帮助00 define host{

01 name test

02 use generic-host

03 address 192.168.0.8 #分布式服务端内监控的主机地址

04 }

05 define service{

06 use generic-service

07 host_name test

08 service_description CPU Load

09 check_command check_nrpe!check_load

10 }

BTW:请注意分布式服务端与主服务端定义主机与服务配置的区别,当分布式服务端定义了主机与服务时,同样需要在主服务端定义一次。freshness_threshold 强制刷新时间,主要的作用是当分布式服务端未提交新的数据时,服务端可以强制进行状态刷新,进行及时的预警。

如何在不安装分布式nagios的情况下,监控另一网络防火墙内的内网主机呢?其实方法很多,比如check_ssh,这里共享一个方法,该方法是同事nonamexz的创意,在此借花献佛。

通过nagios的自定义变量,在nrpe的命令行增加一个端口的参数,通过防火墙进行映射至内网不同的服务器

查看源代码打印帮助00 define command{

01 command_name check_NRPE #定义一个新的命令

02 command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -p $_HOSTPORT$ -t 60

03 }

04 define host{

05 name test

06 use generic-host

07 address 2.2.2.2 #需要监控的服务器的外网地址,比如防火墙地址

08 _PORT 5668 #自定义的外网端口,改端口是通过防火墙进行内的需要监控的服务器的nrpe的端口映射

09 }

10 define service{

11 use generic-service

12 host_name test

13 service_description CPU Load

14 check_command check_NRPE!check_load #这里定义的时候,使用自定义的nrpe

15 }

openssl的编译

问题:编译nrpe的时候,提示libssl找不到,但是inc文件可以找到,已经编译了openssl,并且成功,但就是找不到libssl
出错信息如下:
checking for socklen_t… yes
checking for type of socket size… size_t
checking for SSL headers… SSL headers found in /home/system/nagios
checking for SSL libraries… configure: error: Cannot find ssl libraries

解决:
ldconfig
ld.so.conf添加路径,还是失败
PKG_CONFIG_PATH路径添加,失败
DYLD_LIBRARY_PATH路径添加,失败

没辙了,后来再网上搜到这篇文章:
http://support.nagios.com/knowledgebase/faqs/index.php?option=com_content&view=article&id=52&catid=35&faq_id=449&expand=false&showdesc=true

说明了解决办法,如果e文不好,那么我解释一句,可能您就明白了
then Ok, but with some Openssl packages, the default is to build archive libraries. Shareable libraries must be explicitly asked with a configure option, –enable-shared. Or some developpers don’t wish to use a .so variant and prefer static linkage.
大概的意思是说,openssl这个包,默认的会编译出“存档库”,如果希望编译为“共享库”,需要在编译的时候添加enable-shared的选项,一些开发人员不喜欢使用.so的变体,更喜欢prefer static linkage,

呵呵,明白了,重新编译openssl,添加enable-shared选项,即可解决。

这是我编译openssl的选项:
./config –prefix=/home/system/nagios/ enable-shared –openssldir=/home/system/nagios/openssl