更新
20200202
输出显示pve集群的名称
本来是为了放假安心随手写的,结果这个漫长的假期真的收到了一个报警,因为我有两个pve集群使用ceph,一时间不知道是哪一个在报警,增加一行获取pve集群名,一并输出。
为了及时发现和处理ceph故障,写一个bash脚本检测ceph状态并用钉钉报警。
脚本的大概思路是这样的:
执行检测命令"ceph health",获取输出。
如果输出是"HEALTH_OK":
如果输出不是"HEALTH_OK":
脚本如下,修改电话号码PHONE和钉钉TOKEN就可以了:
# vi check_ceph.sh
#!/bin/bash
LOG=/tmp/cepherr.log
cephHealth=$(ceph health)
cephStat=$(echo $cephHealth | awk '{print $1}')
pveCluster=$(pvecm status | grep Name: | cut -d":" -f2)
PHONE="1xxxxxxxxxx"
TOKEN="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxx183440d2aba9d75bfd8f3cac41f1f06785be9e98"
DING="curl -H \"Content-Type: application/json\" -X POST --data '{\"msgtype\": \"text\", \"text\": {\"content\": \"${pveCluster} ${cephHealth} done!\"}, \"at\": {\"atMobiles\": [${PHONE}], \"isAtAll\": false}}' ${TOKEN}"
if [ $cephStat != HEALTH_OK ]; then
problem=$(echo $cephHealth | awk '{$1=""; print $0}')
if [ -e $LOG ]; then
echo $problem && exit
else
eval $DING
echo $problem > $LOG
fi
else
if [ -e $LOG ]; then
eval $DING
rm $LOG
fi
echo $cephHealth && exit 0
fi让脚本可执行:
# chmod +x /root/check_ceph.sh接下来让定时任务执行脚本,比如每隔10分钟执行一次:
# crontab -e
*/10 * * * * /root/check_ceph.sh测试,在ceph osd设置"noout",等10分钟就钉钉就会收到报警"pve集群名 HEALTH_WARN noout flag(s) set"。
其实pvesh可以通过api获取pve信息,所以可以考虑扩展这个脚本,把集群状态,存储状态,节点状态统统定时收集并报警。