第一章 創建釘釘應用(用於發送報警信息給單獨某個用戶)
打開釘釘管理后台: https://oa.dingtalk.com
創建成功后需要記錄三個值"AgentID","AppKey","AppSecret"。
第二章 創建釘釘機器人(用於發送報警信息到監控群)
2.1創建釘釘群
過程略過。
2.2添加群機器人
#此處要記錄webhook,腳本中需要調用。
第三章 編寫報警腳本(此腳本會在服務器出現異常后調用)

1 此腳本是基於Python3寫的,調用此腳本時會傳入七個參數,參數是Nagios的變量,參數說明見下文。 2 [zhuyuliang@nagios ~]$ cat /usr/local/nagios/python/dingding.py 3 #coding: utf-8 4 import json 5 import sys 6 import requests 7 8 ''' 9 參數含義: 10 警告類型: $NOTIFICATIONTYPE$ 11 服務名稱: $SERVICEDESC$ 12 主機名: $HOSTALIAS$ 13 IP地址: $HOSTADDRESS$ 14 服務狀態: $SERVICESTATE$ 15 時間: $LONGDATETIME$ 16 日志: $SERVICEOUTPUT$ 17 ''' 18 19 warning_type=str(sys.argv[1]) 20 service_name=str(sys.argv[2]) 21 host_name=str(sys.argv[3]) 22 host_IP=str(sys.argv[4]) 23 service_state=str(sys.argv[5]) 24 warning_time=str(sys.argv[6]) 25 warning_log=str(sys.argv[7]) 26 27 ''' 28 用戶的userid,因為固定的,所以寫死了,獲取方法: 29 獲取部門ID: 30 curl https://oapi.dingtalk.com/department/list?access_token=xxx|jq '.' 31 通過部門ID獲取userid: 32 curl https://oapi.dingtalk.com/user/list?access_token=xx\&department_id=xx|jq '.' 33 ''' 34 35 chenning_id='09386937241216057' 36 baihe_id='165726012126376472' 37 tiantaotao_id='215023131029727888' 38 wangfujun_id='014610392229410999' 39 maoweijian_id='014506344727183149' 40 caie_id='01461056511094710' 41 zhaozhibo_id='121027651935582616' 42 43 #項目的IP列表 44 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'] 45 cdh=['47.99.122.122','47.99.134.63','47.99.82.201','47.96.22.59','47.99.53.179'] 46 chess=['106.14.12.179','47.101.144.209','106.14.169.195','47.101.164.250'] 47 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'] 48 49 #發送的信息主體 50 header = {"Content-Type":"application/json;charset=UTF-8"} 51 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)" 52 53 def get_accessToken(appkey,appsecret): 54 ''' 55 此函數用於獲取accessToken 56 ''' 57 json_token=requests.get(url='https://oapi.dingtalk.com/gettoken',params={'appkey':appkey,'appsecret':appsecret}) 58 return json_token.json()['access_token'] 59 60 def send_group(): 61 ''' 62 此函數用於發送報警至釘釘群 63 ''' 64 url='https://oapi.dingtalk.com/robot/send?access_token=7df4cff195905e47527602b7bfab6ecc4fc669392da1e446eebeac05049ddcf7' 65 data = { 66 "msgtype":"text", 67 "text":{ 68 "content":content} 69 } 70 sendData=json.dumps(data).encode('utf-8') 71 result=requests.post(url=url,data=sendData,headers=header) 72 73 def send_someone_data(*args): 74 ''' 75 不同的業務線有不同的信息,為了節省代碼所以定義了一個函數 76 ''' 77 data={ 78 "touser":'|'.join((args[:])), 79 "agentid":236353484, 80 "msgtype":"text", 81 "text":{ 82 "content":content} 83 } 84 return data 85 86 def send_someone(): 87 ''' 88 此函數用於發送信息給某個業務線的負責人 89 ''' 90 access_token=get_accessToken('dingg3bmym6arxwokwee','xxx') 91 url="https://oapi.dingtalk.com/message/send?access_token={}".format(access_token) 92 if host_IP in ITFIN: 93 data=send_someone_data(chenning_id,baihe_id) 94 elif host_IP in cdh: 95 data=send_someone_data(tiantaotao_id,zhaozhibo_id) 96 elif host_IP in chess: 97 data=send_someone_data(wangfujun_id) 98 elif host_IP in sdk or host_IP.startswith('103.56.139'): 99 data=send_someone_data(maoweijian_id,caie_id) 100 sendData=json.dumps(data).encode('utf-8') 101 result=requests.post(url=url,data=sendData,headers=header) 102 103 if __name__ == '__main__': 104 send_group() #只要服務器發生異常都發送報警到你創建的群中 105 send_someone() #根據發生異常的服務器IP來決定發送給哪個用戶
第四章 配置釘釘報警
4.1添加報警,commands.cfg里編寫。
[zhuyuliang@nagios ~]$ tail -6 /usr/local/nagios/etc/objects/commands.cfg ###釘釘報警### define command{ command_name dindin-bj command_line /usr/local/python-3.4/bin/python3.4 /usr/local/nagios/python/dingding.py "$NOTIFICATIONTYPE$""$SERVICEDESC$""$HOSTALIAS$""$HOSTADDRESS$""$SERVICESTATE$""$LONGDATETIME$""$SERVICEOUTPUT$" register 1 }
4.2 聯系人調用報警
[zhuyuliang@nagios ~]$ tail -20 /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 dindin-bj #調用commands.cfg文件中定義的命令 host_notification_commands dindin-bj register 1 } define contactgroup{ #將釘釘聯系人添加到組 contactgroup_name admins alias Nagios Administrators members 139mail,dingding,zq-weixin,mao-weixin,baihe-weixin,huazhen-weixin,zhuyuliang-weixin,tiantaotao-weixin } define contactgroup{ contactgroup_name paiyou alias paiyou members nagiosadmin,dingding,zhanghu-weixin,yujie-weixin,bietao-weixin,louchao-weixin,maxiang-weixin,liujieqing-weixin }
4.3 查看主機,服務調用那些模板
[zhuyuliang@nagios ~]$ grep -vE "^$|^#" /usr/local/nagios/etc/aliyun/host.cfg define host{ use generic_linux_aliyun #應用的模板名稱 host_name ad-server01 alias AD SERVER01 address 120.26.121.119 hostgroups aliyun_linux_ad_group } [zhuyuliang@nagios ~]$ grep -vE "^$|^#" /usr/local/nagios/etc/services/check_ad.cfg define service{ host_name ad-server01 use generic_service #引用的模板名稱 name check_ad service_description Check ad check_command check_nrpe!check_ad }
4.4 修改模板(調用此聯系人)
[zhuyuliang@nagios ~]$ grep -vE "^$|^#" /usr/local/nagios/etc/templates/host_templates.cfg define host{ name generic_linux_aliyun use linux_server } #找到了主機引用的模板,但是此模板還有父級模板,所以要繼續找到父級模板添加聯系人
define host{ name linux_server use generic_host … 省略 contact_groups admins #修改聯系人組,為我們定義的組 register 0 }
[zhuyuliang@nagios ~]$ grep -vE "^$|^#" /usr/local/nagios/etc/templates/service_templates.cfg define service{ name generic_service use services-pnp … 省略 contact_groups admins #修改聯系人組,為我們定義的組 }
4.5 配置報警的整體邏輯。
主機引用模板 -> 模板引用聯系人組 -> 聯系人組包含聯系人 -> 聯系人中調用報警命令 -> 報警命令引用腳本
4.6 檢測配置文件,重啟
#/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg #/etc/init.d/nagios restart