故事背景
由于公司数据库服务器非常多,所以如果真的需要去人工巡检备份情况还是很麻烦,于是就想通过脚本来自动检查并且每天通过钉钉机器人通知到用户。
情况1:当备份数据库能够联网
如果备份服务器能够联网,那么就能直接调用钉钉机器人的 API,这也是最简单的发送钉钉通知的方式,脚本如下,按需修改:
#!/bin/bash ###################################################################### # 用途:MySQL 备份检查钉钉通知 # 作者:Dylan<[email protected]> # 时间:2020-01-15 ###################################################################### ###################################################################### # 钉钉消息 ###################################################################### # 钉钉机器人地址(填写自己的机器人) DINGDING_URL="https://oapi.dingtalk.com/robot/send?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 发送消息函数 function SendMessageToDingding(){ curl "${DINGDING_URL}" -H ‘Content-Type: application/json‘ -d " { \"actionCard\": { \"title\": \"$1\", \"text\": \"$2\", \"hideAvatar\": \"0\", \"btnOrientation\": \"0\", \"btns\": [ { \"title\": \"$1\", \"actionURL\": \"\" } ] }, \"msgtype\": \"actionCard\" }" } ###################################################################### # 系统变量 ###################################################################### # 当日日期 DATE_TODAY=$(/usr/bin/date +\%F) # 昨天日期 DATE_YESTERDAY=$(/usr/bin/date -d last-day +%F) # 当前IP地址 IP_ADDRESS=$(/usr/sbin/ip addr | grep inet | grep -vE ‘inet6|127.0.0.1‘ | awk ‘{print $2}‘ | head -1) ###################################################################### # 用户变量(更改为自己的目录) ###################################################################### # 业务名称 SERVICE_NAME="测试服务" # 备份目录 BACKUP_PATH="/data/backup/mysql-3306" # 当日备份文件名称 BACKUP_FILE_TODAY="all-${DATE_TODAY}.sql" # 昨天备份文件名称 BACKUP_FILE_YESTERDAY="all-${DATE_YESTERDAY}.sql" ###################################################################### # 获取两天的大小进行比较 ###################################################################### # 今天的文件大小 if [[ -f ${BACKUP_PATH}/${BACKUP_FILE_TODAY} ]];then FILE_SIZE_TODAY=$(/usr/bin/ls -l ${BACKUP_PATH}/${BACKUP_FILE_TODAY} | /usr/bin/awk ‘{print $5}‘) FILE_SIZE_TODAY_H=$(/usr/bin/ls -lh ${BACKUP_PATH}/${BACKUP_FILE_TODAY} | /usr/bin/awk ‘{print $5}‘) else FILE_SIZE_TODAY=0 FILE_SIZE_TODAY_H=0 fi # 昨天的文件大小 if [[ -f ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} ]];then FILE_SIZE_YESTERDAY=$(/usr/bin/ls -l ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} | /usr/bin/awk ‘{print $5}‘) FILE_SIZE_YESTERDAY_H=$(/usr/bin/ls -lh ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} | /usr/bin/awk ‘{print $5}‘) else FILE_SIZE_YESTERDAY=0 FILE_SIZE_YESTERDAY_H=0 fi # 消息内容 DINGDING_CONTENT="业务:${SERVICE_NAME}\n\n机器:${IP_ADDRESS}\n\n文件:${BACKUP_FILE_TODAY}\n\n大小:${FILE_SIZE_TODAY}(${FILE_SIZE_TODAY_H})\n\n时间:${DATE_TODAY}\n\n" # 判断大小关系 if [[ ${FILE_SIZE_TODAY} == 0 ]];then SendMessageToDingding "${SERVICE_NAME}数据备份-[失败]" ${DINGDING_CONTENT} elif [[ ${FILE_SIZE_TODAY} -le ${FILE_SIZE_YESTERDAY} ]];then SendMessageToDingding "${SERVICE_NAME}数据备份-[失败]" ${DINGDING_CONTENT} else SendMessageToDingding "${SERVICE_NAME}数据备份-[成功]" ${DINGDING_CONTENT} fi
需要注意红色部分:
0. 业务名称需要改为自己业务的名称。
1. 钉钉机器人的 Token 需要该为自己的机器人。
2. 数据库备份的 SQL 存放目录需要改为自己的目录。
3. 数据库备份的 SQL 名字需要改为自己名字格式。
情况2:服务器无法访问公网
为了数据库安全,某些时候是没有外网的,所以需要内网其它跳板机器帮忙完成消息发送,在备份机器上面定时执行脚本:
#!/bin/bash ###################################################################### # 用途:MySQL 备份检查触发钉钉 # 作者:Dylan<[email protected]> # 时间:2020-01-15 ###################################################################### ###################################################################### # 系统变量 ###################################################################### # 当日日期 DATE_TODAY=$(/usr/bin/date +\%F) # 昨天日期 DATE_YESTERDAY=$(/usr/bin/date -d last-day +\%F) # 当前IP地址 IP_ADDRESS=$(/usr/sbin/ip addr | grep inet | grep -vE ‘inet6|127.0.0.1‘ | awk ‘{print $2}‘ | head -1) ###################################################################### # 用户变量 ###################################################################### # 业务名称 SERVICE_NAME="测试服务" # 备份目录 BACKUP_PATH="/data/backup/mysql-3306" # 当日备份文件名称 BACKUP_FILE_TODAY="all-${DATE_TODAY}.sql" # 昨天备份文件名称 BACKUP_FILE_YESTERDAY="all-${DATE_YESTERDAY}.sql" ###################################################################### # 获取两天的大小进行比较 ###################################################################### # 今天的文件大小 if [[ -f ${BACKUP_PATH}/${BACKUP_FILE_TODAY} ]];then FILE_SIZE_TODAY=$(/usr/bin/ls -l ${BACKUP_PATH}/${BACKUP_FILE_TODAY} | /usr/bin/awk ‘{print $5}‘) FILE_SIZE_TODAY_H=$(/usr/bin/ls -lh ${BACKUP_PATH}/${BACKUP_FILE_TODAY} | /usr/bin/awk ‘{print $5}‘) else FILE_SIZE_TODAY=0 FILE_SIZE_TODAY_H=0 fi # 昨天的文件大小 if [[ -f ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} ]];then FILE_SIZE_YESTERDAY=$(/usr/bin/ls -l ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} | /usr/bin/awk ‘{print $5}‘) FILE_SIZE_YESTERDAY_H=$(/usr/bin/ls -lh ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} | /usr/bin/awk ‘{print $5}‘) else FILE_SIZE_YESTERDAY=0 FILE_SIZE_YESTERDAY_H=0 fi # 判断大小关系 if [[ ${FILE_SIZE_TODAY} == 0 ]];then DINGDING_TITLE="${SERVICE_NAME}数据备份-\[失败\]" elif [[ ${FILE_SIZE_TODAY} -le ${FILE_SIZE_YESTERDAY} ]];then DINGDING_TITLE="${SERVICE_NAME}数据小于昨天-\[失败\]" else DINGDING_TITLE="${SERVICE_NAME}数据备份-\[成功\]" fi # 消息内容 DINGDING_CONTENT="业务:$SERVICE_NAME#机器:$IP_ADDRESS#文件:$BACKUP_FILE_TODAY#大小:$FILE_SIZE_TODAY/$FILE_SIZE_TODAY_H#时间:$DATE_TODAY#" # 服务器远程信息 SERVER_IP="192.168.0.100" SERVER_SSH_USER="root" SERVER_SSH_PORT="22" SERVER_SSH_PASSWORD="123456" SERVER_REMOTE_SH_FILE="/data/shell/MYSQL-BACKUP-DING.sh" # 远程执行 /usr/bin/expect<<EOF spawn ssh -p $SERVER_SSH_PORT [email protected]$SERVER_IP "$SERVER_REMOTE_SH_FILE $DINGDING_TITLE $DINGDING_CONTENT" expect { -timeout 2 "yes/no" {send "yes\r";exp_continue} "*password" {send "$SERVER_SSH_PASSWORD\r"} } expect eof EOF
需要注意:
0. 用户变量需要按照自己的需求修改。
1. 备份机器需要 yum 按照 expect。
2. 远程服务器信息需要配置正确,特别是远程脚本的绝对路径。
远程服务器根据备份服务器脚本中的绝对路径添加以下脚本:
#!/bin/bash ###################################################################### # 用途:MySQL 备份检查钉钉通知 # 作者:Dylan<[email protected]> # 时间:2020-01-15 ###################################################################### ###################################################################### # 钉钉消息 ###################################################################### # 钉钉机器人地址 DINGDING_URL="https://oapi.dingtalk.com/robot/send?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 发送消息函数 function SendMessageToDingding(){ curl "${DINGDING_URL}" -H ‘Content-Type: application/json‘ -d " { \"actionCard\": { \"title\": \"$1\", \"text\": \"$2\", \"hideAvatar\": \"0\", \"btnOrientation\": \"0\", \"btns\": [ { \"title\": \"$1\", \"actionURL\": \"\" } ] }, \"msgtype\": \"actionCard\" }" } # 处理传递的变量 DINGDING_TITLE=$1 DINGDING_CONTENT=${2//#/\\n\\n} # 发送消息 SendMessageToDingding $DINGDING_TITLE $DINGDING_CONTENT
注意机器人地址即可!
最后只需要将情况1的脚本或者情况2备份服务器的脚本加入定时任务每天检查即可!最终发送效果如下:
原文地址:https://www.cnblogs.com/lonelyxmas/p/12409071.html
时间: 2024-11-15 07:03:38