Nagios之事件处理
目标:实现在监控3306端口服务时,出现1次critical软状态时或者在上一次执行后没有成功后出现的第一次硬状态critical情况下,远程执行mysql重启服务,并且每次执行远程重启服务前把报告事件记录到DB中
牵涉技术:
(1)Nagios事件处理原理
(2)Ssh无密码登录执行命令
(3)Perl操作mysql
如果大家对以上三条都掌握了,相信看懂这篇文章也就不成话下了。
##进入正题##
前期准备工作
I.制作ssh无密码登录
实现目标:nagios用户无密码登录server
大家对root用户无密码登录都做过。但是今天,我要做的是普通用户nagios用户无密码登录(在此感谢我同事的技术支持).
角色 | Host_ip | 备注 |
Client | 192.168.x.x | Nagios监控端作为Client,目的是为了远程执行脚本 |
Server | 192.168.x.y | 存启动服务脚本,如:mysql脚本 |
Client端(192.168.x.x)制作
---------------------------------------------------------------------------------------------------
(1) 创建nagios用户略过(Server端也需要)
(2) su – nagios环境下执行
ssh-keygen -t rsa
一路回车便可,无需密码。
(3)将公钥copy到server端nagios家目录下
[nagios@nagios ~]$ scp .ssh/id_rsa.pub nagios@192.168.x.y:/home/nagios/
The authenticity of host '192.168.x.y (192.168.x.y)' can't be established.
RSA key fingerprint is 66:9a:b5:86:3d:81:22:9b:f8:67:9e:af:aa:4c:4a:97.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.x.y' (RSA) to the list of known hosts.
nagios@192.168.x.y's password:
id_rsa.pub 100% 411 0.4KB/s 00:00
---------------------------------------------------------------------------------------------------
Server端(192.168.x.x)制作
--------------------------------------------------------------------------------------------------
(1) 进入server端,登入nagios帐号
(2) 创建mkdir /home/nagios/.ssh
(3) 将公钥匙写入authorized_keys文件:
cat /home/nagios/id_rsa.pub >>.ssh/authorized_keys
(4) 改权限(以root身份或者通过visudo授权给nagios):
chmod 700 /home/nagios/.ssh
chmod 600 /home/nagios/.ssh/authorized_keys
检查 |
SERVER端权限检查 [root@centos-server nagios]# ls -la /home/nagios|grep .ssh drwx------- 2 nagios nagios 4096 Aug 3 09:04 .ssh [root@centos-server nagios]# ls -la /home/nagios/.ssh/ total 12 drw------- 2 nagios nagios 4096 Aug 3 09:04 . drwx------ 4 nagios nagios 4096 Aug 3 09:03 .. -rw------- 1 nagios nagios 411 Aug 3 09:04 authorized_keys 请确保红色标识的内容(保证.ssh目录的权限为700, authorized_keys的权限为600) nagios用户持有者 CLIENT端登录测试 [nagios@nagios ~]$ ssh nagios@192.168.x.y Last login: Wed Aug 3 09:15:59 2011 from 192.168.x.x [nagios@centos-server ~]$ 看到没?从192.168.x.x登录到192.168.x.y无需密码了。 如果没有这样的效果,大家看下是不是前面的权限问题。我曾今也是因为权限折腾了我同事半天。哈哈。 |
II.无密码登录远程执行命令
实现目标:nagios用户远程启动server端mysql服务
-----------------------------------------------------------------------------------------------
Server端(192.168.x.x)制作
------------------------------------------------------------------------------------------------
(1) 配置mysql启动控制脚本
输入以下SQL语句,创建一个具有root权限的用户(admin)和密码(controlmysql):
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY ' controlmysql ';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'127.0.0.1' IDENTIFIED BY ' controlmysql ';
作用:用与启动/关闭控制mysql服务
Mysql控制(启动/停止等)脚本 |
#!/bin/sh mysql_port=3306 mysql_username="admin" mysql_password=" controlmysql " mysql_scripts_path="/data0/mysql/3306" mysqld_path="/usr/local/webserver/mysql" start_mysql() { printf "Starting MySQL...\n" /bin/sh ${mysqld_path}/bin/mysqld_safe --defaults-file=/data0/mysql/${mysql_port}/my.cnf 2>&1 > /dev/null & } stop_mysql() { printf "Stoping MySQL...\n" ${mysqld_path}/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /tmp/mysql.sock shutdown } restart_mysql() { printf "Restarting MySQL...\n" stop_mysql sleep 5 start_mysql } kill_mysql() { kill -9 $(ps -ef | grep 'bin/mysqld_safe' | grep -v 'grep'| awk '{printf $2}') kill -9 $(ps -ef | grep 'libexec/mysqld' | grep -v 'grep' |awk '{printf $2}') } if [ "$1" = "start" ]; then start_mysql elif [ "$1" = "stop" ]; then stop_mysql elif [ "$1" = "restart" ]; then restart_mysql elif [ "$1" = "kill" ]; then kill_mysql else printf "Usage: ${mysql_scripts_path}/mysql {start|stop|restart|kill}\n" fi |
(2) 配置sudo,允许nagios用户执行脚本
**如果没有sudo,yum –y install sudo**
#visudo
添加
nagios ALL=(root) NOPASSWD:/data0/mysql/3306/mysql start
检查 |
SERVER端脚本测试检查 [root@centos-server ~]# netstat -an|grep 3306 [root@centos-server ~]# 说明mysql没有起来 [root@centos-server ~]# /data0/mysql/3306/mysql start Starting MySQL... [root@centos-server ~]# netstat -an|grep 3306 tcp 0 0 :::3306 :::* LISTEN [root@centos-server ~]# 脚本OK,正常 Client端测试(以nagios用户登录) [nagios@nagios ~]$ ssh nagios@192.168.x.y "sudo /data0/mysql/3306/mysql start" sudo: sorry, you must have a tty to run sudo
解决: Server端修改visudo,将下面一行注释 Defaults requiretty 再试 [nagios@nagios ~]$ ssh nagios@192.168.x.y "sudo /data0/mysql/3306/mysql start" Starting MySQL... 正常启动 检查SERVER端 端口3306是否存在 恭喜,基本功已经做完。我们可以去玩监控端nagios配置了 |
III.Nagios监控端配置
(1)nagios基本配置文件如下:
mfs_hosts.cfg |
define host{ use mfs-server host_name mfs-192.168.x.y alias mfs-192.168.x.y address 192.168.x.y } |
mfs_hostgroups.cfg |
define hostgroup{ hostgroup_name mfs-servers alias Mfs Linux Servers members mfs-192.168.x.y } |
mfs_services.cfg |
define service { name mfs-services service_description checkport check_command check_tcp!3306 check_period 24x7 max_check_attempts 2 normal_check_interval 3 retry_check_interval 1 notification_interval 5 notification_period 24x7 notification_options w,u,c,r register 0 } define service{ use mfs-services host_name mfs-192.168.x.y event_handler_enabled 1 event_handler restart_mysql } define service{ use mfs-service host_name mfs-192.168.x.y service_description PING check_command check_ping!100.0,20%!500.0,60% } |
commands.cfg |
define command{ command_name restart_mysql command_line /usr/local/nagios/libexec/restart_mysql $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ $HOSTADDR ESS$ } |
(2)改写/usr/local/nagios/libexec/restart_mysql
restart_mysql |
HostAddress=$4 debug=1 if [ $debug -eq 1 ];then echo "MysqlServer:${HostAddress}" >>/tmp/ReMysql.log fi case "$1" in OK) ;; WARNING) ;; UNKNOWN) ;; CRITICAL) case "$2" in SOFT) case "$3" in 1) if [ $debug -eq 1 ];then echo "Restarting Mysql service (1rd soft critical state)..." >>/tmp/ReMysql.log fi /usr/bin/ssh nagios@${HostAddress} "sudo /data0/mysql/3306/mysql start" ;; esac ;; HARD) if [ $debug -eq 1 ];then echo "Restarting Mysql service..." >>/tmp/ReMysql.log fi /usr/bin/ssh nagios@${HostAddress} "sudo /data0/mysql/3306/mysql start" ;; esac ;; esac exit 0 注明:测试最好将debug设置为1 申明:本脚本暂时的作用是远程重启mysql,后续还要添加写入数据库的脚本。 |
检查 |
Nagios配置文件检查 /usr/local/nagios/bin/nagios –v /usr/local/nagios/etc/nagios.cfg 无错误,重启nagios Service nagios restart 被监控端开启mysql等相关服务,保证监控一切正常!如图: 尝试正常关闭mysql服务 实现目标:当出现第一次软状态的critical情况下,去尝试重启mysql.
以下4条信息足以证明我们想达到的效果已经实现! (1)检查监控端nagios图 (2)检查监控端脚本日志 [root@nagios tmp]# tail -f ReMysql.log MysqlServer:192.168.x.y Restarting Mysql service (1rd soft critical state)... (3)被监控端检查端口是否存在 [root@centos-server ~]# netstat -an|grep 3306 tcp 0 0 :::3306 :::* LISTEN (4)再检查监控端nagios图 注明:到这里我们已经实现了第一个想法,就是远程重启服务。下面,我们要实现将事件记录到mysql中。 |
=======================================================
IV将通知信息写入Mysql
实现目标:将nagios报错信息写入到mysql DB中
角色 | Host_ip | 备注 |
Client | 192.168.x.x | Nagios监控端作为Client,执行将报错信息写入数据库脚本 |
DB Server | 192.168.x.z | 存储报错信息的DB |
DB Server端操作:
-----------------------------------------------------------------------------------------------
(1)创建库
create database nagios;
(2)授权
输入以下SQL语句,创建一个具有插入/修改/删除/浏览权限的用户(nagioslog)和密码(nagioslog)(允许nagios监控端远程登录):
GRANT ALL PRIVILEGES ON nagios.* TO 'nagioslog'@'192.168.x.x' IDENTIFIED BY '12345678';
作用:用与插入/修改/删除/浏览数据
(3)以nagioslog用户登录创建log表
create table log(host_ip varchar(50),services_desc varchar(200),plugin_out varchar(500)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Client端操作
-----------------------------------------------------------------------------------------
(1)安装perl操作mysql环境
perl -MCPAN -e "install DBI"
perl -MCPAN -e "install DBD::mysql"
(2)操作mysql脚本
Perl远程操作mysql脚本 |
#!/bin/perl #Last Modifed by Hahazhu 2011/08/03 use DBI; ##########INIT DEFINED########### my $remote_mysql="192.168.x.z"; my $remote_db="nagios"; my $remote_mysql_user="nagioslog"; my $remote_mysql_pwd="12345678"; my $debug=1; ##########Recevice Values######### my $host_ip=$ARGV[0]; my $service_desc=$ARGV[1]; my $plugin_out=$ARGV[2]; my $dbh = DBI->connect("DBI:mysql:database=$remote_db;host=$remote_mysql", "$remote_mysql_user", "$remote_mysql_pwd", {'RaiseError' => 1}); my $rows = $dbh->do("INSERT INTO log (host_ip, services_desc, plugin_out) VALUES ('$host_ip', '$service_desc', '$plugin_out')"); if ($debug){ print "$rows row(s) affected \n"; } if($debug){ my $sth = $dbh->prepare("SELECT host_ip, services_desc , plugin_out FROM log"); $sth->execute(); while (@data=$sth->fetchrow_array()){ print "$data[0] $data[1] $data[2]\n"; } } $dbh->disconnect(); 申明:测试前请将$debug设置为1. |
检查 |
Nagios端以nagios用户执行插入数据脚本 [nagios@nagios libexec]$ perl insert_log_to_mysql.pl 1.1.1.1 check_3306 "connection refused" 1 row(s) affected 1.1.1.1 check_3306 connection refused DB Server端检查 mysql> select * from log; +---------+---------------+--------------------+ | host_ip | services_desc | plugin_out | +---------+---------------+--------------------+ | 1.1.1.1 | check_3306 | connection refused | +---------+---------------+--------------------+ 1 row in set (0.00 sec) OK,脚本测试无问题。后面的工作就是将其加入到nagios配置里了。 |
V.Nagios服务配置调整
Commands.cfg |
define command{ command_name restart_mysql command_line /usr/local/nagios/libexec/restart_mysql $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ $HOSTADDRESS$ $SERVICEDESC$ "$SERVICEOUTPUT$" } |
启动mysql脚本要调整restart_mysql |
#/bin/sh HostAddress=$4 Services_desc=$5 Plugin_out=$6 debug=1 if [ $debug -eq 1 ];then echo "MysqlServer:${HostAddress}" >>/tmp/ReMysql.log fi case "$1" in OK) ;; WARNING) ;; UNKNOWN) ;; CRITICAL) case "$2" in SOFT) case "$3" in 1) if [ $debug -eq 1 ];then echo "Restarting Mysql service (1rd soft critical state)..." >>/tmp/ReMysql.log fi /usr/bin/perl /usr/local/nagios/libexec/insert_log_to_mysql.pl ${HostAddress} ${Services_desc} ${Plugin_out} /usr/bin/ssh nagios@${HostAddress} "sudo /data0/mysql/3306/mysql start" ;; esac ;; HARD) if [ $debug -eq 1 ];then echo "Restarting Mysql service..." >>/tmp/ReMysql.log fi /usr/bin/perl /usr/local/nagios/libexec/insert_log_to_mysql.pl ${HostAddress} ${Services_desc} “${Plugin_out}” /usr/bin/ssh nagios@${HostAddress} "sudo /data0/mysql/3306/mysql start" ;; esac ;; esac exit 0 申明:调试前最好把debug设置为1 |
检查 |
到了本文最后一部分了,有点激动… 看看,我们验证能不能达到我们下面的目标. 实现目标: 重启mysql服务,必把相关日志记录到另一台mysql DB中。
试验:stop mysql服务 Nagios端检查图: Nagios端日志: [root@nagios ~]# tail -f /tmp/ReMysql.log MysqlServer:192.168.x.y Restarting Mysql service (1rd soft critical state)... 此时检查mysql服务端 [root@centos-server ~]# netstat -an|grep 3306 tcp 0 0 :::3306 :::* LISTEN 再检查记录日志情况: mysql> select * from nagios.log; +--------------+---------------+--------------------+ | host_ip | services_desc | plugin_out | +--------------+---------------+--------------------+ | 192.168.x.y | checkport | Connection refused | +--------------+---------------+--------------------+ 1 row in set (0.00 sec) OK,目标已经实现。不仅实现了远程开机。而且将错误记录下来了。 |
到此,本文结束。我相信大家会有更多的想法去扩展…
本文转自hahazhu0634 51CTO博客,原文链接:http://blog.51cto.com/5ydycm/631215,如需转载请自行联系原作者
相关文章:

张孝祥javascript学习笔记1---HTMLCSS
本节摘要及说明:本节只是对学习过程中知识点的一个简单的记录。 <body>标签的属性 Text属性:用于设定整个网页中的文字颜色 link属性:用于设定一般超链接文本的显示颜色 alink属性:用于设定鼠标移动到超链接上时,超链接文本的显示颜色 …

技术图文:C# VS. Python 读取CSV文件指南
背景 CSV 是一种以逗号进行特征分隔的文本文件类型,在数据库或电子表格中是一种非常常见的导入导出格式。本篇图文就以泰坦尼克号船员获救预测( Kaggle)中使用的数据集为例来说明 C#、Python和Pandas 如何读取 CSV 数据的。 CSV原始文件如下…

零基础学软件测试去哪家培训机构好
移动互联网的时代,几乎每个人都是机不离手,手机软件的应用频率越来越高,软件测试这个岗位的发展前景更是非常可观,很多人都开始学习软测技术,想要知道零基础学软件测试去哪家培训机构好?来看看下面的详细介绍。 零基础…

技术图文:Numpy 一维数组 VS. Pandas Series
背景 Numpy 提供的最重要的数据结构是 ndarray,它是 Python 中 list 的扩展。 Pandas 提供了两种非常重要的数据结构 Series和DataFrame。 Numpy 中的一维数组与 Series 相似,一维数组只是提供了从0开始与位置有关的索引,而Series除了位置…

【Python】向函数传递任意数量的实参
传递任意数量的实参 有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参 def get_letter(*letters):for i in letters:print(i) get_letter(A,B,C,D,E)形参名*letters中的星号让Python创建一个名为letters的空…

word中插入下标
Word2007中为数字加上下标的几种方法: 一:通过插入>公式>>选择,通过此上下标。 二:写下数字,例如5,然后按ctrlshift号三个键,就可添加上标,按ctrl号两键,就可标…

手机应用软件测试的思路与要点
软件测试主要针对于移动互联网行业,那么APP等相关软件的测试工作是非常多的,尤其对于产品的手机项目(应用软件),主要是进行系统测试。针对手机应用软件的系统测试,通常从如下几个角度开展:功能测试,兼容性测…

数据结构与算法:01 绪论
绪论 知识结构: 一、什么是数据结构 例1:电话号码薄的查询问题。 (a1,b1),(a2,b2),…,(an,bn)(a_1,b_1),(a_2,b_2),\dots,(a_n,b_n) (a1,b1),(a2,b2),…,(an,bn) aia_iai:表示姓名,bib_ibi:表示电话…

rar for linux缺少GLIBC_2.7
今天安装rar4.0 for linux,遇到了一个缺少GLIBC_2.7的问题,弄了好久才成功,记录一下,以备不时之需。 系统版本为CentOS 5.5。下载了rar4.0 for linux源码包,解压后,按照makfile文件的提示,进行安…

硅谷产学研的创新循环
在现代社会形态形成的几百年历史中,大学与产业界在分化的体制轨道中形成了各自不同的目标、结构和文化,有关大学与产业合作的种种争议无不缘自于此。今天当知识和技术逐步取代了自然资源和简单劳动力资源而成为首要的创造财富的源泉时,产业界…

java技术培训之File类中常用的构造方法
File类用于封装一个路径,这个路径可以是从系统盘符开始的绝对路径,如:“D:\file\a.txt”,也可以是相对于当前目录而言的相对路径,如:“src\Hello.java”。File类内部封装的路径可以指向一个文件,…

数据结构与算法:02 C#语言基本语法结构
02 C#语言基本语法结构 知识结构: 1、数据类型 第一种分类: 简单数据类型:byte、short、int、long、float、double、char、bool组合数据类型:struct、enum、class、interface 类型描述byte无符号8位整型(ushort) short&#x…

积少成多 Flash(ActionScript 3.0 Flex 3.0) 系列文章索引
[源码下载]积少成多 Flash(ActionScript 3.0 & Flex 3.0) 系列文章索引作者:webabcdFlash 之 ActionScript 3.0 1、积少成多Flash(1) - ActionScript 3.0 基础之数据类型、操作符和流程控制语句介绍Flash ActionScript 3.0 中所有的数据类型都是对象,…
WPF Snoop 2.7 源码研究
转载于:https://www.cnblogs.com/puncha/archive/2012/04/01/3877001.html

java培训基础知识都学哪些
很多人都开始学习java技术,觉得java语言在未来的发展前景空间非常大,事实却是如此,那么针对于零基础的同学, 学习java技术需要学哪些呢?下面我们就来看看java培训基础知识都学哪些? java培训基础知识都学哪些? 1.JavaWeb Linux…

数据结构与算法:03 C#面向对象设计 I
03 C#面向对象设计 I 知识结构: 1、类与对象 类:用高级程序语言实现的一个ADT描述。对象:通过类声明的变量。 2、封装 2.1 什么是封装 把类的内部隐藏起来以防止外部看到内部的实现过程。 2.2 怎样封装 通过限制修饰符private、protect…

Centos7安装编译安装zabbix2.219及mariadb-5.5.46
mariadb-5.5.46的安装: 首先下载mariadb-5.5.46-linux-x86_64.tar.gz,然后使用tar -xf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local目录下 添加数据库组 # groupadd mysql 添加数据库用户 # useradd -g mysql mysql cd /usr/local ln -sv…

软件测试开发:常见测试类型概念
软件测试是软件开发中非常重要的一个环节,软件测试工程师需要对每个环节进行严格把控,才能保证系统在每个阶段得以控制。下面小编就为大家详细介绍一下软件测试开发:常见测试类型概念的相关内容。 软件测试开发:常见测试类型概念: (1)边界测试…

技术图文:C#语言中的泛型 I
C#语言中的泛型 I 知识结构: 1. 泛型概述 泛型广泛应用于容器(Collections)和对容器操作的方法中。 从 .NET Framework2.0 开始,微软提供了一个新的命名空间System.Collections.Generic,其中包含了一些新的基于泛型…

ubuntu搭建svn、git遇到的问题及解决办法
不错的git笔记博客: http://www.cnblogs.com/wanqieddy/category/406859.html http://blog.csdn.net/zxncvb/article/details/22153019 Git学习教程(六)Git日志 http://fsjoy.blog.51cto.com/318484/245261/ 图解git http://my.oschina.net/x…

webstorm同时打开多个project方法
曾经多次碰到过想要打开多个project的时候,可每次打开其他项目时,必须选择新窗口还是替换次窗口,如果新窗口的话就无法跟现在的项目在同一个webstorm中同时进行编辑,需要来回切换窗口,很是不方便,今天无意中…

什么业务场景适合使用Redis?
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年…

Linux基础知识汇总(2)...持续更新中
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566软件安装: {软件安装的几种形式 rpm 由厂商提供二进制包 yum rpm源的前端管理器 src 源码包configure安装 bin 包含rpm和shell将安装一步执…

技术图文:C#语言中的泛型 II
C#语言中的泛型 II 知识结构: 6. 泛型接口 泛型类与泛型接口结合使用是很好的编程习惯,比如用IComparable<T>而非IComparable,以避免值类型上的装箱和拆箱操作。若将接口指定为类型参数的约束(接口约束)&#…

linux档案权限
Linux 下的档案当你对一个档案具有w权限时,你可以具有写入/编辑/新增/修改档案的内容的权限, 但并丌具备有删除该档案本身的权限!对二档案的rwx来说, 主要都是针对『档案的内容』而觊,不档案档名的存在不否没有关系喔&…

新手UI设计师需要掌握的知识和技能
UI设计岗位在近几年的需求是越来越高的,很多零基础学员都开始学习UI设计技术,那么想要成为一名合格的UI设计师,新手UI设计师需要掌握的知识和技能是比较要会的,来看看下面的详细介绍。 新手UI设计师需要掌握的知识和技能ÿ…

数据结构与算法:04 C#面向对象设计 II
04 C#面向对象设计 II 知识结构: 5、属性 例1:属性概念的引入(问题) public class Animal {public int Age;public double Weight;public bool Sex;public Animal(int age, double weight, bool sex){Age age;Weight weight;S…

SharePoint迁移和升级方案
这是之前针对SharePoint迁移和升级写的方案,去掉了敏感的部分,共大家交流吧。SharePointMigrationSolution转载于:https://www.cnblogs.com/zhaojunqi/archive/2012/04/12/2444803.html

零基础如何掌握web前端开发技能
很多零基础学员想要进入到互联网行业都会选择web前端做首选技术语言来学习,但是学习web前端不是那么容易的,想要成为一名合格的web前端工程师,所要掌握的技能一定要会,下面小编就为大家详细的介绍一下零基础如何掌握web前端开发技…
数据结构与算法:05 Leetcode同步练习(一)
Leetcode同步练习(一) 题目01:两数之和 题号:1难度:简单https://leetcode-cn.com/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,…