掌握shell脚本:企业自动化运维脚本实战!

  • 作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 

  • 公众号:网络豆云计算学堂

  • 座右铭:低头赶路,敬事如仪

  • 个人主页: 网络豆的主页​​​​​

目录

 应用场景:

一、代码使用场景

 二、代码实现原理

1. 定义告警阈值和邮箱:

2. 读取主机清单:

3. 获取主机名的函数:

4. 报警函数:

5. 各项检查函数:

6. 主程序逻辑:

代码详解

总结


往期文章:

掌握Shell脚本:Linux命令行自动化初学者指南

掌握shell脚本:Linux脚本常用命令复习

掌握shell脚本:shell变量详解

shell脚本实战案例—批量创建用户与检查服务存活脚本

 应用场景:

在日常的企业运维中,自动化脚本是提高工作效率的重要工具。尤其是对于运维团队而言,自动化巡检脚本可以减少人为检查的繁琐操作,提高故障响应速度,保障服务器和业务的稳定运行。本文将通过一个基于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=== 主机巡检结束 ==="

总结

通过以上自动化运维脚本,运维人员能够快速了解多台服务器的健康状态,大幅度提高巡检效率和运维质量。定制化的告警设置还能帮助及时发现异常,快速响应故障,保障业务服务的正常运行。


🎁 独家粉丝福利大放送!

🎯 想深入了解云计算吗?只需两步,即可获取价值连城的云计算资料!

    关注博主公众号:轻松追踪前沿科技动态,不错过任何精彩内容。
    回复关键词:回复“云计算资料”,立即获取专业、全面的云计算学习资源。

🔥**资料持续更新,无论是初学者还是专家,都能在这里找到您所需的宝贵资源!**🔥


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网络豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值