作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。
公众号:网络豆云计算学堂
座右铭:低头赶路,敬事如仪
个人主页: 网络豆的主页
目录
往期文章:
应用场景:
在日常的企业运维中,自动化脚本是提高工作效率的重要工具。尤其是对于运维团队而言,自动化巡检脚本可以减少人为检查的繁琐操作,提高故障响应速度,保障服务器和业务的稳定运行。本文将通过一个基于Shell编写的服务器巡检脚本,帮助大家深入理解其实现逻辑和原理。
一、代码使用场景
这段Shell脚本适用于企业中运维人员对服务器状态的自动化巡检需求。它能够定时检查服务器的健康状态,包括:
- 主机存活状态
- 磁盘使用率
- 内存使用率
- CPU使用率
- 网络流量
- 业务服务状态(如MySQL、Nginx)
脚本会针对每个监控项设定相应的告警阈值,当发现服务器指标超标时会发出告警邮件,帮助运维人员在第一时间获得系统状态的异常信息。该脚本还支持选择是否发送告警邮件,适合在不同场景下灵活使用。
二、代码实现原理
该脚本的主要结构分为以下几个部分:
1. 定义告警阈值和邮箱:
在脚本开头定义告警邮件接收地址和各项资源的告警阈值,方便根据业务需求自定义。
2. 读取主机清单:
脚本从`hostip.txt`文件中读取所有要巡检的主机IP地址,适合批量管理和巡检多台服务器。
3. 获取主机名的函数:
`get_hostname()`使用SSH连接目标服务器并获取主机名。如果SSH连接失败,将返回“未知主机名”。
4. 报警函数:
`send_alert()`用于将巡检异常信息以邮件的形式发送到指定邮箱,同时会输出信息到终端,确保信息可以被即时查看。
5. 各项检查函数:
- 主机存活检查*:`check_host_alive()`使用ping命令检测主机是否在线,若不可达则触发告警。
- 磁盘使用率检查:`check_disk_usage()`通过`df`命令获取磁盘使用率,如果使用率超过设定的阈值则记录异常信息。
- 内存使用率检查:`check_mem_usage()`使用`free`命令计算内存使用率,超过阈值时触发告警。
- CPU使用率检查:`check_cpu_usage()`使用`top`命令获取CPU使用率,通过`bc`命令进行浮点数比较,超过阈值时告警。
- 网络流量检查:`check_network_traffic()`使用`ifconfig`命令检查网络流量。
- 业务服务检查:`check_services()`检查MySQL和Nginx等关键业务服务状态,未运行时触发告警。
6. 主程序逻辑:
主机做免密,创建hostsip加入到文件
- 首先询问用户是否开启邮件告警功能,方便不同环境下的巡检需求。
- 对每台主机依次调用各项检查函数,生成汇总报告。若用户选择发送邮件,则将汇总信息发送到告警邮箱。
- 将巡检报告打印在终端,方便直接查看各项检查结果。
代码详解
以下是脚本的完整代码。对于每个功能模块,都提供了详细的注释,帮助大家理解实现原理。
#!/bin/bash
# 服务器巡检脚本
# 定义邮箱和告警阈值
ALERT_EMAIL="你的邮箱"
DISK_THRESHOLD=80
MEM_THRESHOLD=80
CPU_THRESHOLD=80
# 读取主机清单
HOSTS=$(cat hostip.txt)
# 获取主机名的函数
get_hostname() {
ssh -o ConnectTimeout=5 $1 "hostname" 2>/dev/null
}
# 报警函数
send_alert() {
local message=$1
local subject=$2
if [ "$send_email" = "y" ]; then
echo "$message" | mail -s "$subject" "$ALERT_EMAIL"
fi
echo "$message"
}
# 主机存活检查
check_host_alive() {
ping -c 2 -W 1 $1 &>/dev/null
if [ $? -ne 0 ]; then
report_message+="ALERT: 主机 $hostname ($1) 不可达\n"
else
report_message+="$hostname ($1) 存活\n"
fi
}
# 磁盘使用率检查
check_disk_usage() {
ssh $1 "df -hT | awk -v threshold=$DISK_THRESHOLD 'NR>1 {if(\$6+0 > threshold) print \$7, \$6}'" 2>/dev/null | while read filesystem usage; do
if [ -n "$filesystem" ]; then
report_message+="ALERT: 主机 $hostname ($1) 磁盘 $filesystem 使用率为 $usage%\n"
else
report_message+="$hostname ($1) 磁盘使用率正常\n"
fi
done
}
# 内存使用率检查
check_mem_usage() {
usage=$(ssh $1 "free | awk '/Mem:/ {printf(\"%.0f\", (\$3/\$2)*100)}'" 2>/dev/null)
if [ $usage -gt $MEM_THRESHOLD ]; then
report_message+="ALERT: 主机 $hostname ($1) 内存使用率为 $usage%\n"
else
report_message+="$hostname ($1) 内存使用率为 $usage%\n"
fi
}
# CPU使用率检查
check_cpu_usage() {
usage=$(ssh $1 "top -bn1 | grep 'Cpu(s)' | awk '{print 100 - \$8}'" 2>/dev/null)
if (( $(echo "$usage > $CPU_THRESHOLD" | bc -l) )); then
report_message+="ALERT: 主机 $hostname ($1) CPU使用率为 $usage%\n"
else
report_message+="$hostname ($1) CPU使用率为 $usage%\n"
fi
}
# 网络流量检查
check_network_traffic() {
ssh $1 "ifconfig eth0 | awk '/RX packets/ {print \"流入: \" \$5} /TX packets/ {print \"流出: \" \$5}'" 2>/dev/null | while read line; do
report_message+="$hostname ($1) 网络 $line\n"
done
}
# 业务服务检查
check_services() {
for service in mysql nginx; do
ssh $1 "systemctl is-active --quiet $service" 2>/dev/null
if [ $? -ne 0 ]; then
report_message+="ALERT: 主机 $hostname ($1) 的 $service 服务停止\n"
else
report_message+="$hostname ($1) 的 $service 服务正常\n"
fi
done
}
# 主程序开始
read -p "是否开启邮件报警功能?(y/n): " send_email
echo "=== 开始主机巡检 ==="
for HOST in $HOSTS; do
hostname=$(get_hostname $HOST)
if [ -z "$hostname" ]; then
hostname="未知主机名"
echo "无法获取 $HOST 的主机名,跳过巡检。"
continue
fi
report_message="==== 巡检主机: $hostname ($HOST) ====\n"
check_host_alive $HOST
check_disk_usage $HOST
check_mem_usage $HOST
check_cpu_usage $HOST
check_network_traffic $HOST
check_services $HOST
if [ "$send_email" = "y" ]; then
echo -e "$report_message" | mail -s "主机巡检报告: $hostname ($HOST)" "$ALERT_EMAIL"
fi
echo -e "$report_message"
echo "==== $hostname ($HOST) 巡检完成 ===="
done
echo -e "\n=== 主机巡检结束 ==="
总结
通过以上自动化运维脚本,运维人员能够快速了解多台服务器的健康状态,大幅度提高巡检效率和运维质量。定制化的告警设置还能帮助及时发现异常,快速响应故障,保障业务服务的正常运行。
🎁 独家粉丝福利大放送!
🎯 想深入了解云计算吗?只需两步,即可获取价值连城的云计算资料!
关注博主公众号:轻松追踪前沿科技动态,不错过任何精彩内容。
回复关键词:回复“云计算资料”,立即获取专业、全面的云计算学习资源。
🔥**资料持续更新,无论是初学者还是专家,都能在这里找到您所需的宝贵资源!**🔥