背景
在运维中需要对主机业务进行周期巡检,为减少人工巡检频率,降低业务停机风险,利用 shell 脚本对 Linux 系统服务运行状态进行主动巡检,异常服务通过钉钉机器人进行告警消息推送。
钉钉开发平台
https://developers.dingtalk.com/document/app/document-upgrade-notice
钉钉机器人设置
curl 介绍
curl是一个命令行访问URL的工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。可以用它构造http request报文,且可以解析服务器返回的http response,额外还支持cookie特性,可以用curl完成web浏览器的基本功能,curl还支持HTTPS/FTP/FTPS/TELNET/LDAP等协议。
curl 常用选项:
-v 详细输出,包含请求和响应的首部
-o test 将指定curl返回保存为test文件,内容从html/jpg到各种MIME类型文件
-O 把输出写到该文件中,保留远程文件的文件名
-C 在保存文件时进行续传
-x ip:port 指定使用的http代理
-c <file> 保存服务器的cookie文件
-H <header:value> 为HTTP请求设置任意header及值
-L 跟随重定向
-S 显示错误信息
-s 静默模式,不输出任何信息
-G 以get的方式发送数据
-f 连接失败是不显示http错误
-d 以post方式传送数据
curl 网站状态码
curl -I -m 15 -o /dev/null -s -w %{http_code} www.baidu.com
-I 仅测试HTTP头信息
-m 15 最多查询15s
-o /dev/null 屏蔽原有输出信息
-s 静默模式,不输出任何东西
-w %{http_code} 控制额外输出
curl 查看出口公网ip
curl myip.ipip.net
测试发送钉钉消息
curl -XPOST -s -L 'https://oapi.dingtalk.com/robot/send?access_token=885fef0ac3be012218955c12259747ae0a62db89e8ff4a62efffdf2aceee8ea8' -H 'Content-Type: application/json' -H "charset:utf-8" -d '{"msgtype": "text",
"text": {
"content": " This is a test message!"
}
}'
钉钉机器人消息
Linux系统服务状态钉钉告警脚本
cat dd.sh
#!/bin/bash
#主机信息
name=`hostname`
ip=`ip a show |grep ens|grep inet |awk '{print $2}'|awk -F '/' '{print $1}'`
date=`date '+%Y-%m-%d-%H:%M:%S'`
#自定义接入钉钉函数
function SendMessageToDingding(){
#钉钉机器人接口地址
url="https://oapi.dingtalk.com/robot/send?access_token=885fef0ac3be012218955c12259747ae0a62db89e8ff4a62efffdf2aceee8ea8"
#推送到钉钉
curl -XPOST -s -L $url -H "Content-Type:application/json" -H "charset:utf-8" -d "
{
\"msgtype\": \"text\",
\"text\": {
\"content\": \"监控主机名:$1\n主机IP: $2\n 异常服务:$3\n 巡检时间:$4\"
},
'at': {
'isAtAll': true
}
}"
}
#输入服务变量文件
cat /mnt/shell/service.txt | while read service
do
stat=`systemctl status $service |grep Active|awk '{print $3}' |cut -c 2-8`
#判断服务状态
if [ $stat != running ];then
#调用函数
SendMessageToDingding $name $ip $service $date
fi
done
巡检服务文件
[root@elk-node1 shell]# cat /mnt/shell/service.txt
nginx
firewalld
filebeat
logstash
停止防火墙服务
systemctl stop firewalld
执行脚本
钉钉机器人告警消息
计划任务
每天08:30 执行脚本
30 08 * * * /usr/bin/bash /mnt/shell/dd.sh >> /tmp/dd.txt