一、前言 在使用Nagios监控时,一般情况下,我们想要实时获取服务器的报警信息,比如哪个服务出了问题,哪个进程挂了,还有服务器的一些相关信息,比如Disk、CPU、Mem等相关信息时,因为我们总不能时刻去关注着Nagios的web监控,因为这一点,那么第三方的应用关联,使得我们在手机端就能查看服务器的相关信息,就变得异常重要~
第三方应用钉钉就可以实现这项功能~
接下来介绍下钉钉是如何实现的
二、实现报警步骤 1、创建钉钉应用【用于发送报警信息给单独某个用户】 首先需要进入钉钉管理后台:https://oa.dingtalk.com 如图所示: 填写相关信息 注意:这里的服务器出口IP,即为允许哪个IP地址来调用此接口 2、然后进行创建 创建成功后,会产生三个变量的值。分别为:“AgentID”、“AppKey”、“AppSecret”。 3、创建钉钉机器人 注:该机器人用于发送报警信息到监控群中,也就是平时需要关注的信息 3.1、创建钉钉群 3.2、添加群机器人,如下所示: 3.3、然后点击下方的自定义机器人
3.4、填写自定义机器人信息 注:这里需要注意的是,要记录该机器人的webhook。【因为需要进行脚本检测,关联钉钉机器人,所以需要在编写的报警脚本中进行调用】。
到此,钉钉报警机器人的创建就已经完成~ 然后就是利用脚本编写Nagios报警信息
三、编写报警信息脚本 注:当服务器出现异常时,该脚本就会被调用 假设脚本为:dingding.py
import json
import sys
import requests
'''
参数含义:
警告类型: $NOTIFICATIONTYPE$
服务名称: $SERVICEDESC$
主机名: $HOSTALIAS$
IP地址: $HOSTADDRESS$
服务状态: $SERVICESTATE$
时间: $LONGDATETIME$
日志: $SERVICEOUTPUT$
'''
warning_type=str(sys.argv[1])
service_name=str(sys.argv[2])
host_name=str(sys.argv[3])
host_IP=str(sys.argv[4])
service_state=str(sys.argv[5])
warning_time=str(sys.argv[6])
warning_log=str(sys.argv[7])
'''
用户的userid,因为固定的,所以写死了,获取方法:
获取部门ID:
curl https://oapi.dingtalk.com/department/list?access_token=xxx|jq '.'
通过部门ID获取userid:
curl https://oapi.dingtalk.com/user/list?access_token=xx\&department_id=xx|jq '.'
'''
chenning_id='09386937241216057'
baihe_id='165726012126376472'
tiantaotao_id='215023131029727888'
wangfujun_id='014610392229410999'
maoweijian_id='014506344727183149'
caie_id='01461056511094710'
zhaozhibo_id='121027651935582616'
ITFIN=['47.99.98.249','47.110.157.52','47.99.88.4','47.99.203.235','47.99.201.252','47.98.240.44','47.99.201.132','47.96.89.81','47.99.106.12','47.99.204.155','120.55.49.10']
cdh=['47.99.122.122','47.99.134.63','47.99.82.201','47.96.22.59','47.99.53.179']
chess=['106.14.12.179','47.101.144.209','106.14.169.195','47.101.164.250']
sdk=['121.40.109.196','121.40.82.16','120.26.106.206','120.26.223.154','120.26.55.62','47.97.244.135','101.37.89.187','116.62.108.28','116.62.109.7','116.62.102.197']
header = {"Content-Type":"application/json;charset=UTF-8"}
content="** Nagios警报 **\n\n警告类型: {}\n服务名称: {}\n主机名: {}\nIP地址: {}\n服务状态: {}\n时间: {}\n日志:\n{}".format(warning_type,service_name,host_name,host_IP,service_state,warning_time,warning_log)"
def get_accessToken(appkey,appsecret):
'''
此函数用于获取accessToken
'''
json_token=requests.get(url='https://oapi.dingtalk.com/gettoken',params={'appkey':appkey,'appsecret':appsecret})
return json_token.json()['access_token']
def send_group():
'''
此函数用于发送报警至钉钉群
'''
url='https://oapi.dingtalk.com/robot/send?access_token=7df4cff195905e47527602b7bfab6ecc4fc669392da1e446eebeac05049ddcf7'
data = {
"msgtype":"text",
"text":{
"content":content}
}
sendData=json.dumps(data).encode('utf-8')
result=requests.post(url=url,data=sendData,headers=header)
def send_someone_data(*args):
'''
不同的业务线有不同的信息,为了节省代码所以定义了一个函数
'''
data={
"touser":'|'.join((args[:])),
"agentid":236353484,
"msgtype":"text",
"text":{
"content":content}
}
return data
def send_someone():
'''
此函数用于发送信息给某个业务线的负责人
'''
access_token=get_accessToken('dingg3bmym6arxwokwee','xxx')
url="https://oapi.dingtalk.com/message/send?access_token={}".format(access_token)
if host_IP in ITFIN:
data=send_someone_data(chenning_id,baihe_id)
elif host_IP in cdh:
data=send_someone_data(tiantaotao_id,zhaozhibo_id)
elif host_IP in chess:
data=send_someone_data(wangfujun_id)
elif host_IP in sdk or host_IP.startswith('103.56.139'):
data=send_someone_data(maoweijian_id,caie_id)
sendData=json.dumps(data).encode('utf-8')
result=requests.post(url=url,data=sendData,headers=header)
if __name__ == '__main__':
send_group()
send_someone()
4、配置钉钉报警 4.1、给Nagios添加报警配置 在Nagios的配置文件中找到对应的commands.cfg,一般情况下是在/usr/local/nagios/etc/objects/commands.cfg 然后编辑该配置文件
vim commands.cfg
define command{
command_name server_bj
command_line /opt/python-3.4/bin/python3.4【Python脚本执行】 /usr/local/nagios/python/dingding.py "$NOTIFICATIONTYPE$""$SERVICEDESC$""$HOSTALIAS$""$HOSTADDRESS$""$SERVICESTATE$""$LONGDATETIME$""$SERVICEOUTPUT$" register 1
}
注:这里的 /opt/python-3.4/ 为Python脚本的执行路径,后面的 /usr/local/nagios/python/dingding.py 为刚才编写的Python监控脚本
4.2、联系人调用报警
vim /usr/local/nagios/etc/objects/contacts.cfg
define contact{
contact_name dingding
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r,f,s
host_notification_options d,u,r,f,s
service_notification_commands server_bj
host_notification_commands server_bj
register 1
}
define contactgroup{
contactgroup_name group1
alias Nagios Administrators
members dingding,zq-weixin,mao-weixin,baihe-weixin
}
define contactgroup{
contactgroup_name group2
alias paiyou
members nagiosadmin,dingding,zhanghu-weixin,yujie-weixin
}
4.3、查看主机、服务调用的模板
vim /usr/local/nagios/etc/aliyun/host.cfg
define host{
use server_aliyun
host_name server01
alias SERVER01
address 120.26.121.119
hostgroups server_group
}
[zhuyuliang@nagios ~]$ vim /usr/local/nagios/etc/services/check_ad.cfg
define service{
host_name server01
use generic_service
name check_ad
service_description Check ad
check_command check_nrpe!check_ad
}
4.4、修改模板【调用联系人】
vim /usr/local/nagios/etc/templates/host_templates.cfg
define host{
name server_aliyun
use linux_server
}
define host{
name linux_server
use generic_host
contact_groups group1
register 0
}
define service{
name generic_service
use services-pnp
… 省略
contact_groups group1
}
4.5、配置报警的逻辑总结 主机引用模板 -> 模板引用联系人组 -> 联系人组包含联系人 -> 联系人中调用报警命令 -> 报警命令引用脚本
配置完成后,然后重启nagios服务
4.6、检查Nagios的配置文件,然后重启
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
/etc/init.d/nagios restart
cp /usr/local/nagios/bin/nagios /etc/init.d/nagios
sudo chkconfig --add nagios
sudo chkconfig nagios on
OK~完结!
|